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

2019-07-21 08:25发布

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


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
23条回答
warship
2019-07-21 14:07
本帖最后由 warship 于 2018-8-9 23:44 编辑

简单地说,volatile就是告诉编译器,不要自作聪明地去优化与这个变量有关的代码
严格做到:每一次的读写都去访问这个变量所在的地址,不要为了省事(提高效率)而直接用CPU自带的寄存器
比如说:
volatile int i;
i=10;
......
int j=i;
编译生成代码时,CPU一般是用寄存器来进行操作的,用一个寄存器比如R0=10,然后把R0的值赋予变量i,
编译后面int j=i;这一句时,因为中间没有对i进行改变的操作,
编译器想,我何必费劲去取i的值呢,我R0不就有现成的i值吗,让j=R0不就行了吗?
正常情况下这是没有问题的,但我们的系统是与硬件相关(或者多任务、中断之类)的,很可能 i 的值通过其它方式(从静态代码中看不出来)中途会改变的,
比如已经变成了20,这时候经过编译器自作主张优化出来的代码,却没有去读这个20,而是让j=R0即=10,得到了错误的结果。
如果我们的程序中,确实有这种某个变量中途会改变的情况,要想不出现上面的错误,就需要声明volatile int i;
告诉编译器,碰到i这个变量,都必须老老实实地到实际地址去取当前值,不要使用R0之类的存货。

一周热门 更多>