关于C语言编程中volatile的使用.doc_第1页
关于C语言编程中volatile的使用.doc_第2页
关于C语言编程中volatile的使用.doc_第3页
关于C语言编程中volatile的使用.doc_第4页
关于C语言编程中volatile的使用.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

关于C语言编程中volatile的使用Volatile含义:volatile类型的限定词,它告诉编译器,变量可以被应用程序本身以外的某个东西进行修改,这些东西包括操作系统,硬件或同时执行的线程等。尤其是,volatile限定词会告诉编译器,不要对该变量进行任何优化,并且总是重新加载来自该变量的内存单元的值。一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。C语言编译器会对用户书写的代码进行优化,譬如如下代码:int a,b,c;a = inWord(0x100); /*读取I/O空间0x100端口的内容存入a变量*/b = a;a = inWord (0x100); /*再次读取I/O空间0x100端口的内容存入a变量*/c = a;很可能被编译器优化为:int a,b,c;a = inWord(0x100); /*读取I/O空间0x100端口的内容存入a变量*/b = a;c = a;但是这样的优化结果可能导致错误,如果I/O空间0x100端口的内容在执行第一次读操作后被其它程序写入新值,则其实第2次读操作读出的内容与第一次不同,b和c的值应该不同。在变量a的定义前加上volatile关键字可以防止编译器的类似优化,正确的做法是:volatile int a;volatile变量可能用于如下几种情况:(1) 并行设备的硬件寄存器(如:状态寄存器,例中的代码属于此类);(2) 一个中断服务子程序中会访问到的非自动变量(也就是全局变量);(3) 多线程应用中被几个任务共享的变量。对代码进行汇编分析:int a;int test(int argc, char *argv)a+;while(a) ;return 0;不使用优化选项,汇编码如下:Disassembly of section .text:00000000 : 0:3c1c0000 luigp,0x0 4:279c0000 addiugp,gp,0 8:0399e021 addugp,gp,t9 c:27bdfff0 addiusp,sp,-16 10:afbc0000 swgp,0(sp) 14:afbe000c sws8,12(sp) 18:afbc0008 swgp,8(sp) 1c:03a0f021 moves8,sp 20:afc40010 swa0,16(s8) 24:afc50014 swa1,20(s8) 28:8f820000 lwv0,0(gp) 2c:00000000 nop 30:8c420000 lwv0,0(v0) 34:00000000 nop 38:24420001 addiuv0,v0,1 / a+; 3c:8f810000 lwat,0(gp) 40:00000000 nop 44:ac220000 swv0,0(at) /store a 48:8f820000 lwv0,0(gp) /load a 4c:00000000 nop 50:8c420000 lwv0,0(v0) 54:00000000 nop 58:1440fffb bnezv0,48 5c:00000000 nop 60:00001021 movev0,zero 64:03c0e821 movesp,s8 68:8fbe000c lws8,12(sp) 6c:03e00008 jrra 70:27bd0010 addiusp,sp,16如果使用-O3优化选项,汇编码如下:Disassembly of section .text:00000000 : 0:3c1c0000 luigp,0x0 4:279c0000 addiugp,gp,0 8:0399e021 addugp,gp,t9 c:8f820000 lwv0,0(gp) 10:00000000 nop 14:8c420000 lwv0,0(v0) 18:00000000 nop 1c:24420001 addiuv0,v0,1 20:8f810000 lwat,0(gp) 24:00000000 nop 28:ac220000 swv0,0(at) 2c:1440ffff bnezv0,2c 30:00000000 nop 34:03e00008 jrra 38:00001021 movev0,zero 3c:00000000 nop可以看出,在进行while语句进行判断时,并没有从内存中重新load 变量a的值,而只是使用寄存器中值进行判断。当另外一个线程,或者任务修改变量a值时,本任务并不知道。当修改a定义为:volatile int a;还使用-O3优化选项,汇编码如下:Disassembly of section .text:00000000 : 0:3c1c0000 luigp,0x0 4:279c0000 addiugp,gp,0 8:0399e021 addugp,gp,t9 c:8f820000 lwv0,0(gp) 10:00000000 nop 14:8c420000 lwv0,0(v0) 18:00000000 nop 1c:24420001 addiuv0,v0,1 20:8f810000 lwat,0(gp) 24:00000000 nop 28:ac220000 swv0,0(at) 2c:8f820000 lwv0,0(gp) 30:00000000 nop 34:8c420000 lwv0,0(v0) 38:00000000 nop 3c:1440fffb bnezv0,2c 40:00001021 movev0,zero 44:03e00008 jrra 48:00000000 nop 4c:00000000 nop从汇编码中看出,增加volatile后,while循环每次都会到

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论