关于C语言编程中volatile的使用

关于C语言编程中volatile的使用

ID:41033331

大小:42.00 KB

页数:5页

时间:2019-08-14

关于C语言编程中volatile的使用_第1页
关于C语言编程中volatile的使用_第2页
关于C语言编程中volatile的使用_第3页
关于C语言编程中volatile的使用_第4页
关于C语言编程中volatile的使用_第5页
资源描述:

《关于C语言编程中volatile的使用》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、关于C语言编程中volatile的使用Volatile含义:volatile类型的限定词,它告诉编译器,变量可以被应用程序本身以外的某个东西进行修改,这些东西包括操作系统,硬件或同时执行的线程等。尤其是,volatile限定词会告诉编译器,不要对该变量进行任何优化,并且总是重新加载来自该变量的内存单元的值。 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。C语言编译器会对用户书写的代码进行优化,譬如如下代码:in

2、ta,b,c;a=inWord(0x100);/*读取I/O空间0x100端口的内容存入a变量*/b=a;a=inWord(0x100);/*再次读取I/O空间0x100端口的内容存入a变量*/c=a;  很可能被编译器优化为:inta,b,c;a=inWord(0x100);/*读取I/O空间0x100端口的内容存入a变量*/b=a;c=a;  但是这样的优化结果可能导致错误,如果I/O空间0x100端口的内容在执行第一次读操作后被其它程序写入新值,则其实第2次读操作读出的内容与第一次不同,b和c的值应该不同。在变量a的定义前加上volatile关键字可以防止编译器的类似

3、优化,正确的做法是:volatileinta;  volatile变量可能用于如下几种情况:  (1)并行设备的硬件寄存器(如:状态寄存器,例中的代码属于此类);  (2)一个中断服务子程序中会访问到的非自动变量(也就是全局变量);  (3)多线程应用中被几个任务共享的变量。对代码进行汇编分析:inta;inttest(intargc,char**argv){a++;while(a){};return0;}不使用优化选项,汇编码如下:Disassemblyofsection.text:00000000:0:3c1c0000luigp,0x04:279c0000a

4、ddiugp,gp,08:0399e021addugp,gp,t9c:27bdfff0addiusp,sp,-1610:afbc0000swgp,0(sp)14:afbe000csws8,12(sp)18:afbc0008swgp,8(sp)1c:03a0f021moves8,sp20:afc40010swa0,16(s8)24:afc50014swa1,20(s8)28:8f820000lwv0,0(gp)2c:00000000nop30:8c420000lwv0,0(v0)34:00000000nop38:24420001addiuv0,v0,1//a++;3c:8f8

5、10000lwat,0(gp)40:00000000nop44:ac220000swv0,0(at)//storea48:8f820000lwv0,0(gp)//loada4c:00000000nop50:8c420000lwv0,0(v0)54:00000000nop58:1440fffbbnezv0,485c:00000000nop60:00001021movev0,zero64:03c0e821movesp,s868:8fbe000clws8,12(sp)6c:03e00008jrra70:27bd0010addiusp,sp,16如果使用-O3

6、优化选项,汇编码如下:Disassemblyofsection.text:00000000:0:3c1c0000luigp,0x04:279c0000addiugp,gp,08:0399e021addugp,gp,t9c:8f820000lwv0,0(gp)10:00000000nop14:8c420000lwv0,0(v0)18:00000000nop1c:24420001addiuv0,v0,120:8f810000lwat,0(gp)24:00000000nop28:ac220000swv0,0(at)2c:1440ffffbnezv0,2c

7、x2c>30:00000000nop34:03e00008jrra38:00001021movev0,zero3c:00000000nop可以看出,在进行while语句进行判断时,并没有从内存中重新load变量a的值,而只是使用寄存器中值进行判断。当另外一个线程,或者任务修改变量a值时,本任务并不知道。当修改a定义为:volatileinta;还使用-O3优化选项,汇编码如下:Disassemblyofsection.text:00000000:0:3c1c0000luigp,0x04:279c0000

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。