volatile的使用

Posted DO_Tonight

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了volatile的使用相关的知识,希望对你有一定的参考价值。

Volatile的使用

一、背景

  • 把keil更新到了最新的版本,采用了V6的编译器,它默认的就是一个3级的优化

  • 在中断中更改了一个全局变量的值,然后在主循环中检测该变量值是否已经改变,结果发现已知没有检测到

二、解决方法

  • 可以把编译器的优化关掉
  • 可以在这个全局变量的前面加上volatile关键字

三、刨根问底

  • 加了volatile关键字的程序,在经过中断以后,会有if语句的判断,可以正常的运行程序。
  • 没有加volatile关键字的程序,在经过中断以后,默认整个while循环里面是空的。
  • 下面是分别是两种写法的汇编程序图片


注意观察最左边的小黄色箭头,它指示的是跳出中断后,第一次执行的代码。

很明显左图有对 if 的检测,但是右图,它的while里面就是一个死循环,编译器自动把 if 给优化掉了。

那么什么时候编译器会这样进行优化呢?我们又应该在何种状态下,加上volatile关键词的修饰呢?

四、如何避免

需要volatile使用的地方

1、并行设备的硬件寄存器(如:状态寄存器)

2、中断服务程序中修改的供其他程序检测的变量

​ 当变量在触发某中断程序中修改,而编译器判断主函数里面没有修改该变量,因此可能只执行一次从内存到某寄存器的读操作,而后每次只会从该寄存器中读取变量副本,使得中断程序的操作被短路。这种情况就是我遇到的情况。

3、多任务环境下各任务间共享的标志

注意:以上从3点内容参考的是知乎上的一篇文章。


以上是关于volatile的使用的主要内容,如果未能解决你的问题,请参考以下文章

volatile关键字

C语言中的volatile

Java中Volatile详解

多线程之volatile关键字

Java Volatile关键字

C# 特性之volatile