嵌入式中的 *(volatile unsigned int *)理解
2016-09-06 21:47
260 查看
转自:http://blog.sina.com.cn/shangbaogen
C语言中*(volatile unsigned int *)0x500的解释:
如下;
(unsigned int *)0x500:将地址0x500强制转化为int型指针
*(unsigned int *)0x500=0x10:对地址为0x500赋值为0x10
其中volatile关键字有以下用途:
(1)用来同步,因为同一个东西可能在不同的存储介质中有多个副本,有些情
况下会使得这些副本中的值不同,这是不允许的,所以干脆用volatile,让它只
有一个,没有其他的副本,这样就不会发生不同步的问题。
如下所示:
volatile的意思是告诉编译器,在编程源代码时,对这个变量不要使用优化。
在一般的程序设计中,如:
int *a; int b;
b = (*a) * (*a);这种情况。
通常编译器为了减少存储器的读写时间,会把代码优化为:
int *a; int b; int c;
c = *a;
b = c * c;
如果把int *a改为volatile int* a编译器就不会自动把它优化掉了。在整个运算过程中,对变量*a的值又读取了一次。防止因变量*a的值在这一期间发生了改变,而导致程序结果的错误。
(2)防止编译器优化去掉某些语句,像我在arm中见到个寄存器非常奇怪,
当中断来的时候,相对应的位置1,而清0又不能向这位写0,向这位写1才是1才
是清中断(清0)
// 假设0x560012300 为寄存器地址
#define INTPAND *(volatile unsigned int *)0x560012300
INTPAND = INTPAND; // 清中断
像编译器如果看到有INTPAND = INTPAND;这种看似无用的操作,如果没有
volatile说明,编译器就很有可能会去掉INTPAND = INTPAND;实际上有用的东
西,却被编译器当没用的东西优化掉了。
(3)当地址是io端口的时候,读写这个地址是不能对它进行缓存的,这是相对
于某些嵌入式中有cache才有这个。比如写这个io端口的时候,如果没有这个
volatile,很可能由于编译器的优化,会先把值先写到一个缓冲区,到一定时候
再写到io端口,这样就不能使数据及时的写到io端口,有了volatile说明以后,
就不会再经过cache,write buffer这种,而是直接写到io端口,从而避免了读写
io端口的延时。
C语言中*(volatile unsigned int *)0x500的解释:
如下;
(unsigned int *)0x500:将地址0x500强制转化为int型指针
*(unsigned int *)0x500=0x10:对地址为0x500赋值为0x10
其中volatile关键字有以下用途:
(1)用来同步,因为同一个东西可能在不同的存储介质中有多个副本,有些情
况下会使得这些副本中的值不同,这是不允许的,所以干脆用volatile,让它只
有一个,没有其他的副本,这样就不会发生不同步的问题。
如下所示:
volatile的意思是告诉编译器,在编程源代码时,对这个变量不要使用优化。
在一般的程序设计中,如:
int *a; int b;
b = (*a) * (*a);这种情况。
通常编译器为了减少存储器的读写时间,会把代码优化为:
int *a; int b; int c;
c = *a;
b = c * c;
如果把int *a改为volatile int* a编译器就不会自动把它优化掉了。在整个运算过程中,对变量*a的值又读取了一次。防止因变量*a的值在这一期间发生了改变,而导致程序结果的错误。
(2)防止编译器优化去掉某些语句,像我在arm中见到个寄存器非常奇怪,
当中断来的时候,相对应的位置1,而清0又不能向这位写0,向这位写1才是1才
是清中断(清0)
// 假设0x560012300 为寄存器地址
#define INTPAND *(volatile unsigned int *)0x560012300
INTPAND = INTPAND; // 清中断
像编译器如果看到有INTPAND = INTPAND;这种看似无用的操作,如果没有
volatile说明,编译器就很有可能会去掉INTPAND = INTPAND;实际上有用的东
西,却被编译器当没用的东西优化掉了。
(3)当地址是io端口的时候,读写这个地址是不能对它进行缓存的,这是相对
于某些嵌入式中有cache才有这个。比如写这个io端口的时候,如果没有这个
volatile,很可能由于编译器的优化,会先把值先写到一个缓冲区,到一定时候
再写到io端口,这样就不能使数据及时的写到io端口,有了volatile说明以后,
就不会再经过cache,write buffer这种,而是直接写到io端口,从而避免了读写
io端口的延时。
相关文章推荐
- 【补充】 嵌入式中的 *(volatile unsigned int *)理解
- 嵌入式中的 *(volatile unsigned int *)理解
- 嵌入式中的 *(volatile unsigned int *)理解
- (C)理解 #define write(b,addr) (void)((*(volatile unsigned int *) (addr)) = (b))
- 嵌入式开发中对(*(volatile unsigned long *)) 的理解
- 关于*((volatile unsigned int *) 0xFFE00000)这种格式的理解
- (volatile unsigned int *)的理解
- (volatile unsigned int *)的理解
- 嵌入式开发中对(*(volatile unsigned long *)) 的理解
- (*(volatile unsigned int *))详解
- 转:对(*(volatile unsigned long *)) 的理解
- 裸机驱动之理解(*(volatile unsigned *)
- ARM定义特殊寄存器(*(volatile unsigned long *))的理解
- C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)
- 对(*(volatile unsigned long *)) 的理解
- 一个表达式 *(volatile unsigned short int *)(0x60020000)=val; 的解析
- (*(volatile unsigned int *))详解-数值常量如何转化为内存地址_转阿拉丁神丢新浪博
- STM32学习笔记之地址 (*(volatile unsigned int *)(x))分析
- (*(volatile unsigned int *))详解
- int与unsigned等转换深入理解(二)