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
分享至:
good 12

发表评论

文明评论,重在参与

暂无评论!
返回上级 返回首页
首页合作客服留言QQ群简版
E界,引领视界
mrpej.com @CopyRight