【C语言】关键字——volatile

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、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这一关键字。

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值