提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、volatile是什么?
volatile 是C语言中的一个关键字,翻译成中文的意思是易变的,通常是用来防止电脑将某个变量进行优化,接下来我们了解一下volatile的使用场景以及防止被优化的目的是什么。
二、应用场景和目的
1.编译器的优化逻辑
代码如下:
val1=x;
val2=x;
智能化的编译器会注意以上代码使用两次x,但并未改变它的值。于是编译器把x的值临时储存在寄存器中,然后在val2需要使用x时,才从寄存器中(而不是从原始内存位置上)读取x的值,以节约时间。这个过程被称为高速缓存(caching)。通常,高速缓存是个不错的优化方案,但是如果一些其他代理在以上两条语句之间改变了x的值,就不能这样优化了。如果没有volatile关键字,编译器就不知道这种事情是否会发生。因此,为安全起见,编译器不会进行高速缓存。
2.应用场景
代码如下:
enComutateDriverIndex Commutation_getCommuPosIndex(enMotorRotationDir rotDirection)
{
uint8 i=0;
volatile sint16 position = EncoderUpdatePosition(); /* get the Mechanic Position */
position %= K_TOTAL_COUNTS_PER_ELE_ROTATION; /* get the electronic Position*/
enComutateDriverIndex cmDrvIdx = COMMUTATION_UNKNOWN;
if(rotDirection == K_ROT_DIR_CW)
{
if(position < 0)
{
position+=K_TOTAL_COUNTS_PER_ELE_ROTATION; /* Transfer to Positive value*/
}
enCOMMUTE_POINT cmP = CommutationPoint_check(position,K_ROT_DIR_CW);
该代码是通过编码器获取电机位置的代码,电机启动,电机换相,电机速度的计算等相关参数都需要电机位置这一参数。因此,我们必须确保第一时间获得电机的最新位置,防止计算中出现误差,导致控制板和驱动板烧毁,所以我们要使用volatile关键字来修饰电机位置position这一变量**,防止被编译器优化,第一时间去原始地址中去读取这一变量地址**。
总结提示:
本文仅仅简单介绍了编译器的优化逻辑,以及关键字volatile的应用场景,让我们更深入理解volatile这一关键字。