良许Linux教程网 干货合集 单片机开发 volatile 至关重要的作用

单片机开发 volatile 至关重要的作用

单片机开发初学者可能对编译器优化的功能不是很关注,但对于经验丰富的工程师来说,掌握代码优化是必不可少的技能。

在本文中,我们将讨论一个与代码优化相关的关键字——volatile。

首先,让我们了解一下volatile是什么。

volatile是一个类型修饰符(type specifier)。

volatile的作用是作为指令关键字,确保这条指令不会被编译器优化省略,并要求每次都直接读取值。

volatile变量表示这个变量的值可能在意想不到的时候被改变,因此编译器不会对这个变量的值进行假设。

以上内容引用自百度百科。

我们可能在学习的过程中已经看过无数次volatile的定义,但我相信大多数人并没有深入理解其中的含义。

只有当你真正开始编程和开发项目时,你才会进一步理解volatile的含义。

哪些场合会用到volatile关键字

当你理解 volatile关键字的含义之后,你就能明白,其实很多场合都能用到 volatile关键字。

1.全局变量

单片机开发,难免会用到全局变量。一些初级工程师,更是全局变量满天飞。这种情况下,使用volatile关键字也许能减少代码bug率。

2.寄存器

单片机开发,寄存器添加volatile关键字应该是必须的,如果你平时有仔细观察,正规一点的【库】都会添加volatile关键字。

具体细分的话,代码里面有很多地方都会用到 volatile关键字。

volatile关键字对编译器优化的影响

我们都知道编译器有优化代码的功能,我们常用的集成开发环境(Keil、 IAR等)都有优化选项。

image-20231027210033647
image-20231027210033647

如果不使用关键字 volatile 申明变量,则编译器可能会对变量的访问并生成非预期的代码或删除预期的功能。

1.何时使用volatile?

常见使用volatile声明的情况:

  • 访问内存映射外设。
  • 在多个线程之间共享全局变量。
  • 在中断例程或信号处理程序中访问全局变量。

比如,在STM32代码中:

#define     __O     volatile             /*!
#define     __IO    volatile             /*!

浏览代码,你会发现,很多地方都使用了“__IO”,也就是volatile.

在跑系统的项目中,线程间共享的全局变量,建议都加上volatile关键字,这一点,很多人没有在意。

2.不使用volatile时可能出现的问题

如果未将变量用volatile声明,则编译器会假定其值不能在其定义的范围之外进行修改。

因此,编译器可能会执行不需要的优化。这可以通过多种方式表现出来:

  • 在轮询硬件时,代码可能会陷入循环。
  • 多线程代码可能会表现出奇怪的行为。
  • 优化可能会导致删除实现故意时序延迟的代码。

举例:

自己写一个延时函数:

void Delay(int Cnt)
{
  int i;

  while(Cnt--)
  {
    i++;
    for(i=0; i

你在不同优化等级情况下,延时时间可能会不一样

同样的代码,你在Keil 和 IAR环境下编译出来的延时时间也可能不一样。

当然,更深入的理解就会牵涉到汇编代码,编译之后的汇编代码会比较直观的呈现差异。

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部