打印

不用volatile竟然不出错,很纳闷

[复制链接]
2345|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dalujia|  楼主 | 2009-3-29 14:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我看到公司的一个程序,大概是这样,现将数据放到缓存中,然后用
  while(bufflen!=0);
等待串口中断将数据传送完,串口中断每次将bufflen减一。
但是这个bufflen是全局变量,但是并没有用volatile,而对
while(bufflen!=0);反汇编的话,就是(伪代码):
  a:    mov  r0, @bufflen;
        bne   a;
不明白程序还能运行无误,应该一直死循环才对啊,不知道是什么原因。用的ads1.2,lpc2214

相关帖子

沙发
mohanwei| | 2009-3-29 14:58 | 只看该作者

等待发送结束,没有什么问题吧?

使用特权

评论回复
板凳
huangqi412| | 2009-3-29 16:54 | 只看该作者

在中断里使用的变量最好加上volatile

但并不等于不加就一定会出错,开摩托车不带头盔不等于一定一摔就死   这个只是提醒编译器不要给乱优化...

使用特权

评论回复
地板
hotpower| | 2009-3-29 17:01 | 只看该作者

使用特权

评论回复
5
computer00| | 2009-3-29 17:21 | 只看该作者

很明显,这个生成的代码都已经去读了呀

如过生成下面这样的代码,那才会死:

      mov  r0, @bufflen;
a:    bne   a;

使用特权

评论回复
6
dalujia|  楼主 | 2009-3-29 21:48 | 只看该作者

re

我弄错了,反汇编是这样的;
mov  r0, @bufflen
a:cmp r0,0
   bne a
继续请求解答。

使用特权

评论回复
7
dalujia|  楼主 | 2009-3-29 21:52 | 只看该作者

是不是我反汇编与实际的生成的汇编不一样啊。

我在axd上进行反汇编,不知道是不是这个原因。

使用特权

评论回复
8
5_0_5| | 2009-3-29 22:03 | 只看该作者

跟编译器有关吧

俺用IAR的时候不加就正常,用GCC的时候不加就出错

使用特权

评论回复
9
computer00| | 2009-3-30 10:55 | 只看该作者

如果汇编是6楼的,那肯定是会死掉了。

使用特权

评论回复
10
songbangyan| | 2009-3-30 12:17 | 只看该作者

好像是编译环境的问题。

有些编译环境在编译文件的时候自动优化了,所以你反汇编后没什么研究价值。在C语言下写的 程序,只要合适,可以使用不需要去研究它的汇编代码。如果你真想研究汇编代码,最好的就是使用汇编!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

145

帖子

1

粉丝