(unsigned int *)0x500:将地址0x500强制转化为int型指针
*(unsigned int *)0x500=0x10:对地址为0x500赋值为0x10
补充:
关键字volatile声明变量可被意想不到的改变,一般用于声明:中断的非自动变量、寄存器定义、再入函数。总之,被它声明的变量编译器不会进行优化,每次都会小心翼翼的从内存中读取、修改、再写入内存。
http://zhidao.baidu.com/question/153757484.html
你去那看下我发那个网址,那个我有个volatile没说,楼上的已经像课本中的
那样说的,我给你来具体化一点。
一个是用来同步,因为同一个东西可能在不同的存储介质中有多个副本,有些情
况下会使得这些副本中的值不同,这是不允许的,所以干脆用volatile,让它只
有一个,没有其他的副本,这样就不会发生不同步的问题。
二个是,防止编译器优化去掉某些语句,像我在arm中见到个寄存器非常奇怪,
当中断来的时候,相对应的位置1,而清0又不能向这位写0,向这位写1才是1才
是清中断(清0),
// 假设0x560012300 为寄存器地址
#define INTPAND *(volatile unsigned int *)0x560012300
INTPAND = INTPAND; // 清中断
像编译器如果看到有INTPAND = INTPAND;这种看似无用的操作,如果没有
volatile说明,编译器就很有可能会去掉INTPAND = INTPAND;实际上有用的东
西,却被编译器当没用的东西优化掉了。
最后,当地址是io端口的时候,读写这个地址是不能对它进行缓存的,这是相对
于某些嵌入式中有cache才有这个。比如写这个io端口的时候,如果没有这个
volatile,很可能由于编译器的优化,会先把值先写到一个缓冲区,到一定时候
再写到io端口,这样就不能使数据及时的写到io端口,有了volatile说明以后,
就不会再经过cache,write buffer这种,而是直接写到io端口,从而避免了读写
io端口的延时。
讲了这么多,不知道你懂了没有。
- -!
补充一下volatile吧,通俗的说吧,因为有缓存的存在,机器在第一次读取0x500里的数据后,数据会留在缓存区,留待下一次使用。但有些情况是物理地址里面的数据会根据程序的安排自动改变,但在下一次使用该地址数据时如果还是直接使用缓存里上一次读取过的数据,而此时物理地址0x500里面的数据已经改变了,程序就会出错,甚至这个错误还不是马上能够表现出来的那就更麻烦了。使用volatile后,机器每次都会到真正的地址0x500里面去读取数据,而不会读缓存里面的数据。