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

    文章

    4941

    浏览量

    73137
  • 编译器
    +关注

    关注

    1

    文章

    1669

    浏览量

    51079
  • volatile
    +关注

    关注

    0

    文章

    46

    浏览量

    13625
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Temu跨境电商按关键字搜索Temu商品API的应用及接口请求示例

    限于以下几个方面: 用户搜索商品:当用户在Temu平台上输入关键字搜索商品时,API会根据输入的关键字返回与之相关的商品列表,帮助用户快速找到感兴趣的商品。 数据分析与市场调研:商家可以利用该API进行关键词搜索数据的分析,了解
    的头像 发表于 11-29 15:08 90次阅读

    哪些场合会用到volatile关键字?

    ,使用volatile关键字也许能减少代码bug率。 2.寄存单片机开发,寄存添加volatile
    发表于 11-25 08:19

    什么是‍‍volatile

    volatile是一个类型修饰符(type specifier)。 volatile的作用是作为指令关键字,确保本条指令不会因编译器优化
    发表于 11-25 06:36

    通过优化代码来提高MCU运行效率

    调用开销。 使用 const 和 volatile 关键字,帮助编译器进行更好的优化。 数据类型选择 使用与MCU字长匹配的数据类型。在32位MCU上,int 和 uint32_t
    发表于 11-12 08:21

    简单的内联汇编介绍

    __”。 __volatile__或 volatile 是可选的。如果添加了该关键字,则要求编译器对后续括号内添加的汇编程序不进行任何优化
    发表于 10-30 08:04

    单片机编程关键字volatile

    volatile 修饰的变量是说这变量可能会被意想不到地改变。通常对于程序员而言,单片机 中用的就算常见了volatile 是易变的,不稳定的意思。其实对于很多人来说,根本没见过这个关键字,不 知道
    发表于 04-02 13:47 2次下载

    什么样的代码会被编译器优化

    现在的编译器有多智能,可能你辛辛苦苦写的代码,在编译器看来就是几句废话,直接被删除掉。
    的头像 发表于 01-16 16:38 929次阅读

    Triton编译器与GPU编程的结合应用

    Triton编译器简介 Triton编译器是一种针对并行计算优化编译器,它能够自动将高级语言代码转换为针对特定硬件优化的低级代码。Trit
    的头像 发表于 12-25 09:13 1313次阅读

    Triton编译器如何提升编程效率

    在现代软件开发中,编译器扮演着至关重要的角色。它们不仅将高级语言代码转换为机器可执行的代码,还通过各种优化技术提升程序的性能。Triton 编译器作为一种先进的编译器,通过多种方式提升
    的头像 发表于 12-25 09:12 1192次阅读

    Triton编译器优化技巧

    在现代计算环境中,编译器的性能对于软件的运行效率至关重要。Triton 编译器作为一个先进的编译器框架,提供了一系列的优化技术,以确保生成的代码既高效又适应不同的硬件架构。 1. 指令
    的头像 发表于 12-25 09:09 1827次阅读

    Triton编译器的优势与劣势分析

    Triton编译器作为一种新兴的深度学习编译器,具有一系列显著的优势,同时也存在一些潜在的劣势。以下是对Triton编译器优势与劣势的分析: 优势 高效性能优化 : Triton
    的头像 发表于 12-25 09:07 1863次阅读

    Triton编译器在机器学习中的应用

    1. Triton编译器概述 Triton编译器是NVIDIA Triton推理服务平台的一部分,它负责将深度学习模型转换为优化的格式,以便在NVIDIA GPU上高效运行。Triton编译器
    的头像 发表于 12-24 18:13 1627次阅读

    TMS320C6000优化编译器v7.4测试版用户指南

    电子发烧友网站提供《TMS320C6000优化编译器v7.4测试版用户指南.pdf》资料免费下载
    发表于 12-24 17:42 0次下载
    TMS320C6000<b class='flag-5'>优化</b><b class='flag-5'>编译器</b>v7.4测试版用户指南

    Triton编译器与其他编译器的比较

    Triton编译器与其他编译器的比较主要体现在以下几个方面: 一、定位与目标 Triton编译器 : 定位:专注于深度学习中最核心、最耗时的张量运算的优化。 目标:提供一个高度抽象、灵
    的头像 发表于 12-24 17:25 1580次阅读

    Triton编译器功能介绍 Triton编译器使用教程

    Triton 是一个开源的编译器前端,它支持多种编程语言,包括 C、C++、Fortran 和 Ada。Triton 旨在提供一个可扩展和可定制的编译器框架,允许开发者添加新的编程语言特性和优化技术
    的头像 发表于 12-24 17:23 2686次阅读