关于C语言编程中volatile的使用.doc
《关于C语言编程中volatile的使用.doc》由会员分享,可在线阅读,更多相关《关于C语言编程中volatile的使用.doc(5页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、关于C语言编程中volatile的使用Volatile含义:volatile类型的限定词,它告诉编译器,变量可以被应用程序本身以外的某个东西进行修改,这些东西包括操作系统,硬件或同时执行的线程等。尤其是,volatile限定词会告诉编译器,不要对该变量进行任何优化,并且总是重新加载来自该变量的内存单元的值。一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。C语言编译器会对用户书写的代码进行优化,譬如如下代码:int a,b,c;a =
2、 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关键字可以防止编译器的类似优化,正确
3、的做法是: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:0
4、399e021 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:8
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 关于 语言 编程 volatile 使用
限制150内