MDK中const与volatile关键字使用及事项.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

MDK中Const和volatile的使用

volatile的使用

区分C程序员和嵌入式系统程序员的最基本的问题。搞嵌入式的程序员经常同硬件、中断、

RTOS等等打交道,所有这些都要求用到volatile变量。不懂得volatile的内容将会带来。

有时在编译代码如果选用了优化级别-O2和-O3,会产生某些问题。例如,可能在争夺

硬件资源而陷入死循环,或者多个进程有些预想不到的行为。当遇到这些情况,你可能需要把有

些变量定义为volatile。

如果将一个变量定义为volatile则相当于告诉编译器该变量可能随时被改变,例如作

系统或硬件所改变。因为带有限定符volatile的变量可以在任何时刻改变,该变量的地址可

能被频繁地。这就意味着编译器不能对这些变量实现优化,例如,将变量缓存到寄存器避免

内存。

相反,如果一个变量未被定义成volatile,则编译器认为该变量不能在应用程序之外改变。

因此编译器可对这种变量实行优化。关键字volatile也不能,可能会产生错误,比如如下例

子:

C代码通过编译器优化后的反汇编

intsquare(volatileint*ptr)……

{ldrr1,[r0]

return*ptr**ptr;ldrr0,[r0]

}mulr0,r1,r0

……

这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,

编译器优化代码后将产生上表右边的代码。

由于*ptr的值可能被意想不到地该变,因此[r0]内存单元内的值可能是不同的。结果,这段

代码可能返不是你所期望的平方值!

正确的代码应该如下:

TheuseofConstandvolatileinMDK

Useofvolatile

ThemostbasicquestionthatdifferentiatesCprogrammersfromembeddedsystems

programmers.Embeddedprogrammersoftendealwithhardware,interrupts,RTOS,etc.,allofwhich

requiretheuseofvolatilevariab.Notunderstandingthecontentsofvolatilecanleadtodisaster.

Sometimeswhencompilingcode,ifoptimizationlevels-O2and-O3areselected,

certainproblemswilloccur.Forexample,itmaybecompetingforhardware

resourcesandfallingintoaninfiniteloop,ormultipleprocesse

文档评论(0)

kay5620 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8001056127000014

1亿VIP精品文档

相关文档