初学者可能不太关心编译器优化功能,但对于经验丰富的工程师来说,掌握代码优化是一项必备技能。
今天的话题是关于关键字volatile在代码优化中的作用。
一、关键词volatile是什么? volatile是类型限定符。
volatile的作用是作为指令的关键字,通过编译器的优化不省略该指令,每次都需要直接读取值。
volatile变量是指变量可能会意外更改,编译器不假设变量值。
-来自百度百科
volatile的定义在学习中应该看过很多次,但是我想大多数人都没有深刻理解它的意思。
威武的犀牛实际编程和开发项目后,其含义会得到进一步理解。
二、volatile关键字对编译器优化的影响
我们知道编译器具有优化代码的功能,而常见的集成开发环境(Keil、IAR等)具有优化选项。
如果不使用关键字volatile声明变量,编译器可能会访问变量以生成意外代码或删除意外功能。
何时使用volatile?
经常使用volatile宣言时:访问内存映射外围设备。
在多个线程之间共享全局变量。
通过中断例程或信号处理程序访问全局变量。
例如,在STM32代码中:
#define__Ovolatile/*!
通过代码,可以看到很多地方都在使用“__IO”,即volatile。
在系统中运行的项目中,建议在线程之间共享的全局变量中使用volatile关键字,这一点很多人并不介意。
不使用volatile可能出现的问题
如果变量未在volatile中声明,编译器假设该值不能在定义的范围之外更改。
因此,编译器可能会执行不必要的优化。 这可以用各种各样的方法来表现。 轮询硬件可能会导致代码陷入循环。
多线程代码可能会显示奇怪的行为。
优化可能会删除导致有意定时延迟的代码。
示例:
自己写延迟函数:
voiddelay(intCNT ) {int i; while(CNT---- ) I; for(I=0; i10; I; }
延迟时间可能因优化级别而异
即使是同一代码,在Keil和IAR环境中编译的延迟时间也可能不同。
当然,更深入的理解涉及汇编代码,编译后的汇编代码在直观上表现出差异。
文章来源于stronger黄,作者stronger黄