Volatile限制符在嵌入式C程序设计的运用

时间:2022-03-28 09:49:29

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;