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、多任务环境下各任务间共享的标志
以上是关于volatile的使用的主要内容,如果未能解决你的问题,请参考以下文章