论volatile重要性

Embeded dtkun 1388℃ 0评论

先发个效果对比图。

一开始还真的没想到会因为一个关键字而让程序异常了,只是后来没办法了,回想起arm中定义的寄存器前面都会有volatile这个关键字,结果原来是真的是这个问题,优化器真的自作聪明地给优化掉了。。。

那到底发生什么事呢?

下面是C代码,一个函数,两份代码由于只有多了一个volatile关键字,所以就贴一份好了。

这个函数的逻辑好简单,就是为了发送指定长度的字符串到串口中断。就这样看是看不清楚究竟有发生什么变化的。那就再进入汇编看看。

可以看出,假设不加volatile的话,UTX0IF寄存的值不会每次进入函数都进行一次读取,而是只检查一次,明显可以看出编译器认为这个变量没有被修改,所以不会改变,所以优化掉了,变成 jbc _UTX0IF,00128$ 一句话带过,因此造成IF还未有准备好就给U0DBUF另外一个数据,就掩盖了前一个还未发送的数据,导致出现丢帧的怪情况。。还有得说说IAR是不会有这个情况出现的。。应该是默认是这样的吧。。我用的是linux下的sdcc,linux下的工具通常都是这样灵活的了,也可以说不人性化。。。

转载请注明:猫头鹰工作室 » 论volatile重要性

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址