打印

为什么这样就能清中断挂起、中断寄存器??

[复制链接]
4117|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
谢谢分享|  楼主 | 2011-10-27 12:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
谢谢分享|  楼主 | 2011-10-27 14:23 | 只看该作者
我找到原因了。原来这个特殊点。是写一清零的。 呵呵

使用特权

评论回复
板凳
sjl2006| | 2011-10-28 14:19 | 只看该作者
如果rSRCPND的类型定义里没有volatile,这样还行吗?

使用特权

评论回复
地板
sjl2006| | 2011-10-28 14:29 | 只看该作者
再问一个问题,如果写成rSRCPND = rSRCPND; 这样是等价的吗?

使用特权

评论回复
5
谢谢分享|  楼主 | 2011-11-13 12:32 | 只看该作者
3# sjl2006

之前都没注意, 这就是不好的习惯。要改。

  刚刚在百度查了一下Volatile的用法。有Volatile声明 编译器就不进行优化,就是每次都是从原始地址读数据而不是从备份寄存器读取。因为这个变量的值会被意想不到的改变。比如中断,假如没有volatile声明的话在中断改变的值与在主函数读到的值就不一样。这样rSRCPND=rSECPND 就是等价的了,加了就是不一样。 是这样理解么?

使用特权

评论回复
6
sjl2006| | 2011-11-16 12:47 | 只看该作者
本帖最后由 sjl2006 于 2011-11-17 12:00 编辑

以gnu为例,如果用调试模式,不加volatile而用你主帖的写法,是可以的;如果开了code size reduce优化,你的主帖写法第二句很可能会被优化掉。rSRCPND = rSRCPND是否等价于主帖写法,主要取决于rSRCPND是否限制为volatile类型指针的目标,如果限制,开不开优化都等价;如果未限制,调试模式下等价,非调试模式下有可能被优化掉。
同样的问题出现在这里:
rSRCPND=0;
rSRCPND=1;
如果没加volatile修饰,而开了优化,这个寄存器(假设是一个映射到处理器地址空间的普通寄存器)能被正确赋值吗?有兴趣可以反汇编一把看看。

使用特权

评论回复
7
谢谢分享|  楼主 | 2011-11-16 21:43 | 只看该作者
6# sjl2006

谢谢,现在没有弄ARM了  要去找工作了。复习下基础。谢谢你哦,到时玩的时候肯定会肯定很多问题。:hug:

使用特权

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

本版积分规则

个人签名:历经挫折才能站的更稳.加油

1

主题

392

帖子

2

粉丝