原创 Volatile

2009-4-26 15:49 1642 8 9 分类: 工程师职场
在嵌入式系统中经常使用到Volatile,对于volatile的用法,我根据自己的理解做如下阐述,希望大家可以发表评论: 
在c语言中,volatile关键字是一种类型修饰符, 用它声明的类型变量表示该变量可以被某些编译器未知的外部因素(比如:操作系统、硬件或者其它线程)更改. 遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址(定义的变量在内存中的地址)的稳定访问。
编译器对代码的优化是指:CPU在执行的过程中,因为访问内存的速度远没有cpu的执行速度快,为了提高效率,引入了高速缓存cache. C编译器在编译时如果不知道变量会被其它外部因素(操作系统、硬件或者其它线程)修改,那么就会对该变量进行标识,即优化.那么这个变量在CPU的执行过 程中,就会被放到高速缓存cache去,进而达到对变量的快速访问. 
在了解了优化的概念后,试想如果我们事先就知道该变量会被外部因素改变,那么我们就在这个变量定义前加上Volatile,这样编译器就不会对该变量进行优化.这样该变量在cpu处理的过程当中,就不会被放到高速缓存cache中. 
为什么要让变量在执行的过程中不被放到cache中去呢?如果变量是被外部因素改变,那么cpu就无法判断出这个变量已经被改变,那么程序在执行的过程中 如果使用到该变量,还会继续使用cache中的变量,但是这个变量其实已经被改变了.需要到内存地址中更新其内容了.还有一个原因,在一些寄存器变量或数 据端口的使用中,因为寄存器变量本身也是靠cache来处理,为了避免引起错误,也可以使用volatile修饰符.(简单的说使用volatile的目 的就是:让对volatile 变量的存取不能缓存到寄存器,每次使用时需要重新存取) 
(cpu判断变量是否被改变是靠编译器在编译的时候指出的,一般编译器判断的标准是这个变量在两次被读去之间有没有被改变,也就是说该变量是否被放在了赋值语句的左边)



PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1381176 2009-4-29 00:28

编译器未知的某些因素修改。。。。
相关推荐阅读
用户194589 2009-04-26 10:43
JTAG
什么是jtag接口JTAG(Joint Test Action Group ,联合测试行动小组 ) 是一种国际标准测试协议,主要用于芯片内部测试及对系统进行仿真、调试, JTAG 技术是一种嵌入式调试...
用户194589 2009-04-25 18:58
关于集电极开路(OC)或漏极开路(OD)输出的结构?
我们先来说说集电极开路输出的结构。集电极开路输出的结构如图1所示,右边的那个三极管集电极什么都不接,所以叫做集电极开路(左边的三极管为反相之用,使输入为“0”时,输出也为“0”)。对于图1,当左端的输...
用户194589 2009-04-25 18:56
多余的引脚怎么办?例如单片机不用IO口?
输入口不要悬空,尤其是输入阻抗高的,更不能悬空。例如在CMOS电路中,如果输入口悬空,可能会导致输入电平处于非0和非1的中间状态,这将会使输出级的上下两个推动管同时导通,从而产生很大电流。一般的做法是...
EE直播间
更多
我要评论
1
8
关闭 站长推荐上一条 /3 下一条