0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 作者:黄工的嵌入式技术 2020-02-28 17:15 次阅读

初学的朋友可能不怎么关心优化选项,但对于经验丰富的工程师来说,掌握代码优化是必备技能。

今天讲述的话题就是关于代码优化中,关键字volatile在优化过程中起到的作用。

一、关于volatile

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

volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。

volatile变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。

---来自百度百科

volatile的定义,应该在读书时都看过无数遍。但我相信绝大部分人都没有深刻理解其中含义。

但当你真正编程,开发项目之后,你就会进一步理解其中含义。

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

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

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

1.何时使用volatile?

常见使用volatile声明的情况:

访问内存映射外设。

在多个线程之间共享全局变量。

在中断例程或信号处理程序中访问全局变量。

比如,在STM32代码中:

#define __O volatile /*!< Defines 'write only' permissions */#define     __IO    volatile             /*!< Defines 'read / write' permissions */

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

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

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

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

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

在轮询硬件时,代码可能会陷入循环。

多线程代码可能会表现出奇怪的行为。

优化可能会导致删除实现故意时序延迟的代码。


举例:

自己写一个延时函数:

void Delay(int Cnt){ int i; while(Cnt--) { i++; for(i=0; i<10; i++); }}

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

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

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4556

    浏览量

    66800
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48625
  • volatile
    +关注

    关注

    0

    文章

    44

    浏览量

    12954
收藏 人收藏

    评论

    相关推荐

    在NVM和本地\"内存中定义数组(静态 /global /local)的\"关键字是什么?

    在 NVM 和本地\"内存中定义数组(静态 /global /local)的\"关键字是什么? 还有与 32 位对齐的关键字怎么样。
    发表于 01-25 07:52

    探讨多线程编程中的volatile关键字应用

    有时候,我们可能需要在指针类型之间进行转换,而编译器会认为这是不安全的操作,从而导致编译错误。使用volatile关键字可以告知编译器,这个
    发表于 12-27 13:53 194次阅读

    你还记得这个C语言关键字吗?

    当你使用volatile关键字时,你告诉编译器该变量的值可能会在程序的执行过程中被外部因素更改,因此编译器不应该对该变量的读写进行优化。下面
    的头像 发表于 12-17 08:00 171次阅读
    你还记得这个C语言<b class='flag-5'>关键字</b>吗?

    嵌入式软件开发常用的关键字和运算符

    volatile是一个特征修饰符,提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,告诉编译器对该变量不做
    的头像 发表于 12-04 12:22 368次阅读

    编译器优化选项

    一个程序首先要保证正确性,在保证正确性的基础上,性能也是一个重要的考量。要编写高性能的程序,第一,必须选择合适的算法和数据结构;第二,应该编写编译器能够有效优化以转换成高效可执行代码的源代码,要做到
    的头像 发表于 11-24 15:37 412次阅读
    <b class='flag-5'>编译器</b>的<b class='flag-5'>优化</b>选项

    IAR能否在整个工程中搜索关键字

    像mdk可以在整个工程中搜索关键字 IAR应该也有类似的功能吧,但是我貌似没有找到
    发表于 11-08 07:21

    关键字volatile是什么?volatile关键字编译器优化的影响

    在我的技术交流群里,经常会看到大家讨论一些“奇怪”的问题,其中有好几次我都发现,是他们全局变量“惹的祸”,问题就是全局变量被优化导致的。
    的头像 发表于 11-03 11:47 342次阅读
    <b class='flag-5'>关键字</b><b class='flag-5'>volatile</b>是什么?<b class='flag-5'>volatile</b><b class='flag-5'>关键字</b>对<b class='flag-5'>编译器</b><b class='flag-5'>优化</b>的影响

    在嵌入式中定义变量时volatile关键字的作用是什么?

    在嵌入式中定义变量时volatile关键字的作用?
    发表于 10-24 07:50

    程序中变量加volatile关键字是做什么用途的?

    为什么变量定义要加上这个关键字
    发表于 10-13 07:15

    C语言编译器代码优化volatile详解 - 第14节 #硬声创作季

    函数代码c语言编译器
    充八万
    发布于 :2023年09月01日 13:32:35

    C语言编译器代码优化volatile详解 - 第7节 #硬声创作季

    C语言程序函数代码编译器
    充八万
    发布于 :2023年09月01日 13:26:44

    ARM编译器优化版本1.0

    ARM编译器armcc可以优化您的代码以实现小代码和高性能。 本教程介绍了编译器执行的主要优化技术,并解释了如何控制编译器
    发表于 08-28 07:11

    C++中常用关键字详解(2)

    在C++中,volatile是一个关键字,用于修饰变量,告诉编译器该变量的值可能在程序流程之外被意外修改,因此编译器不应该对该变量进行优化
    发表于 08-08 16:15 190次阅读

    volatile关键字的用途

    当同一全局变量在多个线程之间被共享时,有可能会出现同步错误,编译器可能会将访问该全局变量的代码优化为访问某个寄存器,而不会再次访问相应的内存,导致程序运行错误。
    发表于 06-07 10:22 258次阅读

    深度学习编译器之Layerout Transform优化

    继续深度学习编译器优化工作解读,本篇文章要介绍的是OneFlow系统中如何基于MLIR实现Layerout Transform。
    的头像 发表于 05-18 17:32 420次阅读