• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

求助一下C语言中的volatile作用

送你的F103 2018-08-15 浏览量:1055
我发现stm32f10x.h文件里进行了宏定义#define     __O     volatile                  /*!< defines 'write only' permissions     */#define     __IO    volatile                  /*!< defines 'read / write' permissions   */
但是通过网上查询对volatile没有太明白,想请问一下各位有没有什么简单的理解方式,我不要求太深入、太专业,只要能让我这个新人简单明白大概的作用即可,能举出例子更好。
非常感谢各位的教导!
2 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案

  • 1.告诉compiler不能做任何优化
    2.表示用volatile定义的变量会在程序外被改变每次都必须从内存中读取,而不能把他放在cache或寄存器中重复使用

    一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份

    比如这个语句:while (ready==0);
    如果没有说明ready这个变量是volatile,这句话要么可能被编译器优化掉,要么可能只能执行一次,要么可能永远满足不了,成为死循环。

    • 发布于 2018-08-15
    • 举报
    • 评论 0
    • 8
    • 0

其他答案 数量:19
  • 在程序运行的时候如果某个寄存器或者变量没有被其他程序操作过,再次读取的时候就可以优化为直接读内存中的数据,不必读取寄存器数据。但是如果这个寄存器数据有可能被外部的某个系统改变,那么编译器就不能使用前面说的优化方案,因为虽然内部没有操作,但是可能外部操作改变了寄存器值,所以每一次访问都必须读取寄存器值,这时候就需要增加volatile 关键字,告诉编译器,这个变量时随时变化的,不要进行优化读取,以解决数据不同步的问题。
    • 发布于2018-08-15
    • 举报
    • 评论 0
    • 3
    • 0

  • 就是不会对变量进行优化,提高可靠性
    • 发布于2018-08-15
    • 举报
    • 评论 0
    • 2
    • 0

  • volatile意思是外界可以改变,即变量可以通过arm的指令操作改变其值,也可以通过GPIO的输入电平改变,实质是告诉cpu这个变量的值使用时需要重新读取,而不是读取缓存值,没有这个volatile修饰,cpu默认会从缓存区读取值
    • 发布于2018-08-15
    • 举报
    • 评论 0
    • 1
    • 0

  • 百科上说的很详细了 就是防止被编译器优化的

    https://baike.baidu.com/item/volatile/10606957?fr=aladdin​

    • 发布于2018-08-15
    • 举报
    • 评论 0
    • 1
    • 0

  • 防止定义的变量被编译器优化掉而产生逻辑错误的
    • 发布于2018-08-15
    • 举报
    • 评论 0
    • 1
    • 0

  • 用volatile关键字定义变量,相当于告诉编译器,

    这个变量的值会随时发生变化,每次使用时都需要去内存里

    重新读取它的值,并不要随意针对它作优化。
    建议使用volatile变量的场所:
    (1) 并行设备的硬件寄存器
    (2) 一个中断服务子程序中会访问到的非自动变量(全局变量)
    (3) 多线程应用中被几个任务共享的变量

    • 发布于2018-08-15
    • 举报
    • 评论 0
    • 1
    • 0

  • 程序里面的用到的变量会放到暂存取,如果不加volatile,第二次再读变量时候直接取了暂存取的值,而这时寄存器的数值变化了,那么读到的还是第一次的值,就不是第二次想要的,加了volatile每次读都去寄存器度,避免缓存导致出错。


    • 发布于2018-08-15
    • 举报
    • 评论 0
    • 1
    • 0

  • 主要是标志,让编译器不进行优化,而且所有该值的使用时都从内存中临时读取(以获得最新值)
    • 发布于2018-08-15
    • 举报
    • 评论 0
    • 1
    • 0

  • 这个是禁止变量编译的过程中被优化,可以理解为易变的变量修饰
    • 发布于2018-08-17
    • 举报
    • 评论 0
    • 1
    • 0

  • 这个要禁止变量的编译项目   以防误动作
    • 发布于2018-08-24
    • 举报
    • 评论 0
    • 0
    • 0

  • 主要是防止变量在寄存器的操作中被编译器优化,防止你的数据出现逻辑错误
    • 发布于2018-08-25
    • 举报
    • 评论 0
    • 0
    • 0

  • 禁止优化,读取该变量的值时必须从它原本的地址里面去读
    • 发布于2018-08-26
    • 举报
    • 评论 0
    • 0
    • 0

  • 简单来说就是,每次访问这个类型的变量的时候,就必须去这个变量所在的原地址上访问。有时候我们写的程序中有些变量的值,是经过编译器优化的,有可能某一个变量的值可以从一个中间变量中读取出来,加上那个关键字就是不要投机取巧,老老实实去原地址读取变量的数据。
    • 发布于2018-08-27
    • 举报
    • 评论 0
    • 0
    • 0

  • volatile变量是提醒编译器,变量要从它的内存地址直接拿它的最原始的数据,而不是在缓存中的备份,主要是为了提高变量调用的实时性。
    • 发布于2018-08-30
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

求助一下C语言中的volatile作用