欢迎来到天天文库
浏览记录
ID:52470386
大小:83.70 KB
页数:9页
时间:2020-03-27
《C语言之volatile实例技巧讲解.pdf》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、volatile的本意是一般有两种说法--1.“暂态的”;2.“易变的”。这两种说法都有可行。但是究竟volatile是什么意思,现举例说明(以Keil-c与a51为例例子来自KeilFQA),看完例子后你应该明白volatile的意思了,如果还不明白,那只好再看一遍了。例1.voidmain(void){volatileinti;intj;i=1;//1不被优化i=1i=2;//2不被优化i=1i=3;//3不被优化i=1j=1;//4被优化j=2;//5被优化j=3;//6j=3}----------------------------------------
2、-----------------------------例2.函数:voidfunc(void){unsignedcharxdataxdata_junk;unsignedcharxdata*p=&xdata_junk;unsignedchart1,t2;t1=*p;t2=*p;}编译的汇编为:00007E00RMOVR6,#HIGHxdata_junk00027F00RMOVR7,#LOWxdata_junk;----Variable’p’assignedtoRegister’R6/R7’----00048F82MOVDPL,R700068E83MOVDPH,R
3、6;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!注意0008E0MOVXA,@DPTR0009F500RMOVt1,A000BF500RMOVt2,A;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!000D22RET将函数变为:voidfunc(void){volatileunsignedcharxdataxdata_junk;volatileunsignedcharxdata*p=&xdata_junk;unsignedchart1,t2;t1=*p;t2=*p;}编译的汇编为:00007E00RMOVR6,#HIGHxdata_jun
4、k00027F00RMOVR7,#LOWxdata_junk[Page];----Variable’p’assignedtoRegister’R6/R7’----00048F82MOVDPL,R700068E83MOVDPH,R6;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0008E0MOVXA,@DPTR0009F500RMOVt1,Aa处000BE0MOVXA,@DPTR000CF500RMOVt2,A;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!000E22RET比较结果可以看出来,未用volatil
5、e关键字时,只从*p所指的地址读一次如在a处*p的内容有变化,则t2得到的则不是真正*p的内容。---------------------------------------------------------------------例3volatileunsignedcharbdatavar;//usevolatilekeywordheresbitvar_0=var^0;sbitvar_1=var^1;unsignedcharxdatavalues[10];voidmain(void){unsignedchari;for(i=0;i6、;i++){var=values[i];if(var_0){var_1=1;//a处values[i]=var;//withoutthevolatilekeyword,thecompiler//assumesthat’var’isunmodifiedanddoesnot//reloadthevariablecontent.}}}在此例中,如在a处到下一句运行前,var如有变化则不会,如var=0xff;则在[Page]values[i]=var;得到的还是values[i]=1;-------------------------------------------7、--------------------------应用举例:例1.#defineDBYTE((unsignedcharvolatiledata*)0)说明:此处不用volatile关键字,可能得不到真正的内容。---------------------------------------------------------------------例2.#defineTEST_VOLATILE_C//***************************************************************//verwendeteIncludeD8、ateie
6、;i++){var=values[i];if(var_0){var_1=1;//a处values[i]=var;//withoutthevolatilekeyword,thecompiler//assumesthat’var’isunmodifiedanddoesnot//reloadthevariablecontent.}}}在此例中,如在a处到下一句运行前,var如有变化则不会,如var=0xff;则在[Page]values[i]=var;得到的还是values[i]=1;-------------------------------------------
7、--------------------------应用举例:例1.#defineDBYTE((unsignedcharvolatiledata*)0)说明:此处不用volatile关键字,可能得不到真正的内容。---------------------------------------------------------------------例2.#defineTEST_VOLATILE_C//***************************************************************//verwendeteIncludeD
8、ateie
此文档下载收益归作者所有