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

[复制链接]
4879|6
 楼主| 谢谢分享 发表于 2011-10-27 12:16 | 显示全部楼层 |阅读模式
源程序的是这样的
temp=rSRCPND;
rSRCPND =temp;
temp=rINTPND;
rINTPND =temp;

为什么这样也行啊。自己的值赋给自己为什么就能改变自己的值。。。

我不懂。怎么理解啊
 楼主| 谢谢分享 发表于 2011-10-27 14:23 | 显示全部楼层
我找到原因了。原来这个特殊点。是写一清零的。 呵呵
sjl2006 发表于 2011-10-28 14:19 | 显示全部楼层
如果rSRCPND的类型定义里没有volatile,这样还行吗?
sjl2006 发表于 2011-10-28 14:29 | 显示全部楼层
再问一个问题,如果写成rSRCPND = rSRCPND; 这样是等价的吗?
 楼主| 谢谢分享 发表于 2011-11-13 12:32 | 显示全部楼层
3# sjl2006

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

  刚刚在百度查了一下Volatile的用法。有Volatile声明 编译器就不进行优化,就是每次都是从原始地址读数据而不是从备份寄存器读取。因为这个变量的值会被意想不到的改变。比如中断,假如没有volatile声明的话在中断改变的值与在主函数读到的值就不一样。这样rSRCPND=rSECPND 就是等价的了,加了就是不一样。 是这样理解么?
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修饰,而开了优化,这个寄存器(假设是一个映射到处理器地址空间的普通寄存器)能被正确赋值吗?有兴趣可以反汇编一把看看。
 楼主| 谢谢分享 发表于 2011-11-16 21:43 | 显示全部楼层
6# sjl2006

谢谢,现在没有弄ARM了  要去找工作了。复习下基础。谢谢你哦,到时玩的时候肯定会肯定很多问题。:hug:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

1

主题

392

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部