volatile的本意为“暂态的”、“易变的”,该说明符祈祷一直编译器优化的作用。
说明:访问内部高速缓存CACHE 比 访问外部RAM 快很多,编译器优化会尽量减少存取访问外部RAM(是否可以理解为变量一般都存放在外部RAM中的?)。
1.若没有加上volatile限制符的变量,程序运行会自动从原先已经存在内部高速缓存CACHE,而不是外部RAM->变量存放的地方提取该变量的值。若在此期间,该变量的值发生变化,则程序得到的值可能是原先改变前的值,即原先是x=0,中途变为了x=1,有可能程序在后面再次用到该值的时候会误认为是x=0。
--------------->编译器将一些认为不会再变化的变量 事先放在在 内部高速缓存CACHE 中,而这些变量若再发生变化,只会改变存放在RAM变量的值,而不会去改变其在 内部高速缓存CACHE 的值。
2.若加上volatile限制符的变量,程序就会老老实实去访问 存储在外部RAM 的变量的值,不再取巧。
总而言之:被volatile声明的变量在程序运行时,每次都会从实际内存中读取最新的数据,而不是使用的内部高速缓存CACHE的暂存的数据。
volatile常使用在:
A:存储器映射的硬件寄存器中。
B:中断服务程序中修改的供其他程序检测的变量中。
C:多任务环境下各任务间共享的标志中。
-------------------------------------------->上代码!
例如:
char x=0,y=0,z=0;
//读取0x5400000内容,放入x变量
x=Read(0x5400000);
y=x;
x=Read(0x5400000);
z=x;
-----------------------------------------------------
编译器会优化为:
x=Read(0x5400000);
y=x;
//若程序运行到这里,Read(0x5400000)的值发生改变,则z的值将不会随着改变。
z=x;
----------------------------------------------------
应该改为:
volatile char x;
char y=0,z=0;