volatile的作用

作者: manhuami2007
上传时间为: 2016-11-17 08:56 AM
2016-11-17
阅读:

在嵌入式工程中经常见到变量前有volatile修饰,那么volatile是干什么用的呢?

有些工程在使用更高优化等级编译后,会出现以下问题时可能就需要在一些变量前加上volatile。

  1. 轮询硬件时循环会卡住
  2. 多线程的代码出现问题

使用更高优化等级编译的程序,在运行时变量会被缓存到寄存器中,而不是每次都从变量的内存地址上取数据,这样就能够减少内存访问时间,提高运行速度。但是一些变量可能被中断、另一个线程或者硬件修改。这时变量所在内存地址上的值会变化,而缓存到寄存器中的值却不会因为这些修改而变化。这样就会造成运行结果和预期不一样。举例说明,看以下程序和其反汇编程序:

从反汇编的程序可知:未加volatile的程序中,buffer_full在循环外加载到R1寄存器中,之后在循环中不再从内存地址上取这个数据,而是使用R1寄存器中的值,但是使用volatile的程序中,在每次循环中都会从buffer_full的内存地址上取数据。这样当某个中断更改了buffer_full后,未加volatile程序中的buffer_full并不会变化,则会一直陷入循环中。

所以volatile的作用就是告诉编译器,某个变量会在执行之外被修改,每次引用时必须访问其内存地址,而不要进行优化。
那么什么样的变量需要volatile修饰?
下面3种情况的变量必须加上volatile修饰:

  1. 在中断例程中访问的全局变量
  2. 在多个线程中共享的全局变量
  3. 内存映射的外围设备,如UART的数据寄存器

全部评论 ()
条评论
写评论

创建讨论帖子

登录 后参与评论
系统提示