当前位置: 代码迷 >> 单片机 >> 大家好,请问个关于volatile 的有关问题
  详细解决方案

大家好,请问个关于volatile 的有关问题

热度:154   发布时间:2016-04-28 14:54:56.0
大家好,请教个关于volatile 的问题
今天查了下资料,发现嵌入式编程里面经常要用到volatile,加上这个修饰符的意思就是说明你定义的这个变量会可能会被随时修改(在中断或多线程?),叫编译器不要去优化它,我才知道麻烦来了,项目中我在单片机里面对一些全局数组的定义前面都没加volatile,这些数组的值可能会在中断中被修改,还有其他一些变量也是,但是我在测试中也完全没感觉到有什么不一样,程序按照预期的去运行,之前连续跑了1个星期也没有任何奇怪现象,请问我还要去修改程序,加上volatile吗?现在是没时间给我测试了。。
------解决方案--------------------
防止被优化,只是一个方面。加了 volatile 的变量,系统认为它随时可能已经被其它地方修改了,所以读这个变量中的数据时会做必要的处理。

这些网上都可以查到的。
------解决方案--------------------
中断确实会改你的变量,也确实可能引起问题,出了问题查起来很麻烦。
如果你不放心,反编译一下所有读取这个变量的地方,看看是不是被优化掉了。如果没有被优化,那么放心使用吧,不过要提醒后来的人小心使用。
------解决方案--------------------
正如LZ说的,变量定义为volatile可能会被意想不到的改变、优化器在用到这个变量时必须每次都小心地重读这个变量的值、而不是使用保存在寄存器中的备份。举个例子吧,通过串口进行数据收发,收到数据后在串口中断中置收到数据标志flag(全局),在主程序中根据flag的值作相应的操作,如果flag没有定义为volatile,则可能使用寄存器中的备份,从而检测不到flag的改变。
通常要使用volatile的地方:
1、并行设备的硬件寄存器(如状态寄存器)
2、一个中断服务子程序中会访问到的非自动变量
3、多线程中被几个任务共享的变量
当然要看不同的编译器的优化情况,如果没做优化则不用考虑这些问题,不过目前的编译器貌似都会或多或少的进行优化(我之前用的CodeWarrior是优化的),所以一般对以上情况是要加volatile的
------解决方案--------------------
引用:
忘记说了,之前没加volatile也没事

优化的化,对于一些重要的标志量最好加(确实是有的时候没事,但我也遇到有问题的情况,就是我提到的串口中断问题,调试了好久);对于大的全局变量应该是放到内存中的(寄存器很少的,提高cpu性能用),所以就算是在上述的三种情况中也不用加volatile(如串口中队接收数据的数组)
  相关解决方案