volatile实例技巧讲解
2012/6/13 11:26:00 请友读忠(更多) E界MRP开发下载网 302阅 欢迎进入C/C++编程社区论坛,与300万技术人员互动交流 >>进入volatile的本意是一般有两种说法--1.“暂态的”;2.“易变的”。这两种说法都有可行。但是究竟volatile是什么意思,现举例说明(以Keil-c与a51为例
例子来自KeilFQA),看完例子后你应该明白volatile的意思了,如果还不明白,那只好
再看一遍了。
例1.
voidmain(void)
{
volatileinti;
intj;
i=1;//1不被优化i=1
i=2;//2不被优化i=1
i=3;//3不被优化i=1
j=1;//4被优化
j=2;//5被优化
j=3;//6j=3
}
---------------------------------------------------------------------
例2.
函数:
voidfunc(void)
{
unsigned*xdataxdata_junk;
unsigned*xdata*p=&xdata_junk;
unsigned*t1,t2;
t1=*p;
t2=*p;
}
编译的汇编为:
00007E00RMOVR6,#HIGHxdata_junk
00027F00RMOVR7,#LOWxdata_junk
;----Variable’p’assignedtoRegister’R6/R7’----
00048F82MOVDPL,R7
00068E83MOVDPH,R6
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!注意
0008E0MOVXA,@DPTR
0009F500RMOVt1,A
000BF500RMOVt2,A
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
000D22RET
将函数变为:
voidfunc(void)
{
volatileunsigned*xdataxdata_junk;
volatileunsigned*xdata*p=&xdata_junk;
unsigned*t1,t2;
t1=*p;
t2=*p;
}
编译的汇编为:
00007E00RMOVR6,#HIGHxdata_junk
00027F00RMOVR7,#LOWxdata_junk [Page]
;----Variable’p’assignedtoRegister’R6/R7’----
00048F82MOVDPL,R7
00068E83MOVDPH,R6
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
0008E0MOVXA,@DPTR
0009F500RMOVt1,Aa处
000BE0MOVXA,@DPTR
000CF500RMOVt2,A
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
000E22RET
比较结果可以看出来,未用volatile关键字时,只从*p所指的地址读一次
如在a处*p的内容有变化,则t2得到的则不是真正*p的内容。
---------------------------------------------------------------------
例3
volatileunsigned*bdatavar;//usevolatilekeywordhere
sbitvar_0=var^0;
sbitvar_1=var^1;
unsigned*xdatavalues[10];
voidmain(void){
unsigned*i;
for(i=0;i<sizeof(values);i++){
var=values[i];
if(var_0){
var_1=1;//a处
values[i]=var;//withoutthevolatilekeyword,thecompiler
//assumesthat’var’isunmodified*doesnot
发表评论