查看: 773|回复: 0

volatile的作用

[复制链接]
  • TA的每日心情
    慵懒
    2016-11-22 11:58
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2016-11-17 08:56:06 | 显示全部楼层 |阅读模式
    分享到:
    在嵌入式工程中经常见到变量前有volatile修饰,那么volatile是干什么用的呢?
    有些工程在使用更高优化等级编译后,会出现以下问题时可能就需要在一些变量前加上volatile。

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


    从反汇编的程序可知:未加volatile的程序中,buffer_full在循环外加载到R1寄存器中,之后在循环中不再从内存地址上取这个数据,而是使用R1寄存器中的值,但是使用volatile的程序中,在每次循环中都会从buffer_full的内存地址上取数据。这样当某个中断更改了buffer_full后,未加volatile程序中的buffer_full并不会变化,则会一直陷入循环中。
    所以volatile的作用就是告诉编译器,某个变量会在执行之外被修改,每次引用时必须访问其内存地址,而不要进行优化。
    那么什么样的变量需要volatile修饰?
    下面3种情况的变量必须加上volatile修饰:

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

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-3-29 18:08 , Processed in 0.110583 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.