1.violate影响编译器结果的输出,violate变量随时可能发生变化,与violate有关的运算不要进行编译优化,以免出错.
例如:
volatile int i=10; int j = i; ... int k = i;violate告诉编译器变量i是随时可能发生变化的,每次使用i必须从i的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中.
而优化的做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在k中。而不是重新从i里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说volatile可以保证对特殊地址的稳定访问,不会出错.
2.violate可能的变量种类:(1)并行设备的硬件寄存器,(2)多线程应用中被几个任务共享的变量.
3.关于violate的几个问题:
1)一个参数既可以是const还可以是volatile吗?解释为什么。
2); 一个指针可以是volatile 吗?解释为什么。
3); 下面的函数有什么错误:
int square(volatile int *ptr) { return *ptr * *ptr; }下面是答案:
int square(volatile int *ptr) { int a,b; a = *ptr; b = *ptr; return a * b; }由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:
long square(volatile int *ptr) { int a; a = *ptr; return a * a; }4.在嵌入式中
(1)告诉编译器不进行任何的优化
(2)表示用volatile定义的变量会在程序外被改变,每次都必须从内存中读取,而不能把他放在cache或寄存器中重复使用