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

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

3天内不再提示

直正懂得volatile完全的重要性

Q4MP_gh_c472c21 来源:未知 作者:李倩 2018-05-30 14:28 次阅读

1、引言

volatile影响编译器编译的结果输出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码时会进行编译优化,加volatile关键字的变量有关的运算,将不进行编译优化。)。

例如:

2、volatile

volatile 告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中。

而优化做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在k中。而不是重新从i里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说volatile可以保证对特殊地址的稳定访问,不会出错。

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:

1) 并行设备的硬件寄存器(如:状态寄存器)

2) 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)

3) 多线程应用中被几个任务共享的变量回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员嵌入式系统程序员的最基本的问题。搞嵌入式的家伙们经常同硬件、中断、RTOS等等打交道,所有这些都要求用到volatile变量。不懂得volatile的内容将会带来灾难。假设被面试者正确地回答了这是问题(嗯,怀疑是否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。

1)一个参数既可以是const还可以是volatile吗?解释为什么。2)一个指针可以是volatile 吗?解释为什么。3) 下面的函数有什么错误:

下面是答案:1)是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。2) 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。3) 这段代码有点变态。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:

由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:

3、volatile 用法

嵌入式编程中经常用到 volatile这个关键字,在网上查了下他的用法可以归结为以下两点:

一:告诉compiler不能做任何优化

比如要往某一地址送两指令:

结果第一个指令丢失。如果用volatile, compiler就不允许做任何的优化,从而保证程序的原意:

即使你要compiler做优化,它也不会把两次付值语句间化为一。它只能做其它的优化。这对device driver程序员很有用。

二:表示用volatile定义的变量会在程序外被改变,每次都必须从内存中读取,而不能把他放在cache或寄存器中重复使用。

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

    关注

    4963

    文章

    18161

    浏览量

    286548
  • 编译器
    +关注

    关注

    1

    文章

    1564

    浏览量

    48531
  • volatile
    +关注

    关注

    0

    文章

    44

    浏览量

    12948

原文标题:嵌入式编程中经常用到的关键字 volatile 浅析

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    单片机中volatile定义的作用

    ,所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。  假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是
    发表于 04-15 09:30

    volatile 和 const

    是否会是这样),我将稍微深究一下,看一下这家伙是不是懂得volatile完全重要性。 1)
    发表于 06-23 23:20

    理解C语言中的_IO ,_I,_O,volatile,const

    带来灾难。假设被面试者正确地回答了这是问题(嗯,怀疑是否会是这样),我将稍微深究一下,看一下这家伙是不是懂得volatile完全
    发表于 02-26 17:43

    volatile用法分享!

    ,所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是
    发表于 10-13 23:29

    BGA焊接温度控制重要性

    `请问BGA焊接温度控制重要性有哪些?`
    发表于 03-26 16:41

    Syncer模块的重要性是什么?

    我在我的项目中使用25G以太网IP。通过打开此IP的示例设计,我们可以看到许多SYNCER模块,一个FSM模块和一个流量生成器模块。我想问一下这些Syncer模块的重要性是什么,我是否需要在我的最终设计中使用所有syncer模块。
    发表于 05-18 09:25

    代码规范的重要性是什么

    论代码规范的重要性
    发表于 05-19 13:07

    使用ODDR原语的重要性是什么?

    你好我将virtex5 LX50与具有应根据standardEIA / TIA-644 LVDS规范终止的输出数据的设备连接起来我在用着IBUFDS用于将输入LVDS转换为LVTTL,OBUFDS用于输出信号和时钟这是这样做的正确方法为此目的使用ODDR原语的重要性是什么?问候uzmeed
    发表于 06-17 14:59

    欠压保护的重要性

    欠压保护的重要性双电源供电时欠压保护电路的注意事项
    发表于 03-03 06:06

    什么是网络拓扑,它的重要性是什么?

    什么是网络拓扑,它的重要性是什么?
    发表于 03-17 06:50

    ATPG是什么?ATPG有何重要性

    ATPG是什么?ATPG有何重要性?常见的DFT技术有哪几种?
    发表于 11-02 09:31

    时钟服务器的重要性是什么?

    时钟服务器的重要性是什么?
    发表于 11-08 08:31

    UPS的重要性

    中心机房的UPS太重要了,前不久就出现过停电坏了一个磁盘陈列硬盘的事故,一个2T的硬盘坏了,还好有一个备用的硬盘使用,否则磁盘陈列里的资料就岌岌可危了。服务器多了,UPS的重要性尤其重要,学校周边
    发表于 11-16 09:09

    arm汇编的重要性是什么?

    arm汇编的重要性是什么?
    发表于 11-30 08:03

    POE浪涌保护的重要性是什么?

    POE浪涌保护的重要性是什么?
    发表于 01-14 06:07