嵌入式中的 *(volatile unsigned int *)0x500 解释

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的值在这一期间发生了改变,而致使程序结果的错误。it

(2)防止编译器优化去掉某些语句,像我在arm中见到个寄存器很是奇怪,当中断来的时候,相对应的位置1,而清0又不能向这位写0,向这位写1才是1才是清中断(清0), io

// 假设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端口的延时。

相关文章
相关标签/搜索