关于“读-修改-写”的问题?

[复制链接]
 楼主| 电子菜鸟435 发表于 2009-11-9 15:53 | 显示全部楼层 |阅读模式
本帖最后由 电子菜鸟435 于 2009-11-9 15:58 编辑

在 周立功的《深入浅出ARM7》中经常看到:
PINSEL0 = (PINSEL0 & (~(1<<5))|(1<<5) ;  /*不会影响其它管脚*/

但是
PINSEL0 = PINSEL0 | (1<<5);      /*也不会影响到其它管脚*/

两个语句都是“读-修改-写”为什么非要用PINSEL0 = (PINSEL0 & (~(1<<5))|(1<<5),
而不是PINSEL0 = PINSEL0 | (1<<5);
请指教!



BitFu 发表于 2009-11-9 17:29 | 显示全部楼层
PINSEL0 = (PINSEL0 & (~(1<<5))|(1<<5) ;  
这个是不是写错了?
hulan1985 发表于 2009-11-9 18:14 | 显示全部楼层
我看过深入浅出AVR,呵呵
 楼主| 电子菜鸟435 发表于 2009-11-10 09:18 | 显示全部楼层
本帖最后由 电子菜鸟435 于 2009-11-10 10:00 编辑

2# BitFu
好像没错,我回去看下书,再回复你
 楼主| 电子菜鸟435 发表于 2009-11-13 09:33 | 显示全部楼层
本帖最后由 电子菜鸟435 于 2009-11-13 09:36 编辑


这是我在周立功的论坛上得到的最后回答,这之后他们就没有理我了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
liliang9554 发表于 2009-11-13 18:54 | 显示全部楼层
嗯,学习到不少东西
wuzx-61 发表于 2009-11-13 19:42 | 显示全部楼层
还在学汇编,正准备转向C,敬候!
 楼主| 电子菜鸟435 发表于 2009-11-16 09:21 | 显示全部楼层
本帖最后由 电子菜鸟435 于 2009-11-16 09:35 编辑

2# BitFu
是错了,应该是:
PINSEL0 = (PINSEL0 & (~(1<<5)))|(1<<5);
当时觉得自己是对的,也没仔细看。不好意思。
谢谢你指正。
另:   
         PINSEL0 = (PINSEL0 & (~(1<<5)))|(1<<5);
[0xe59f00a0]    ldr      r0,0x4000038c ; = #0xe002c000
[0xe5901000]   ldr      r1,[r0,#0]
[0xe3811020]   orr      r1,r1,#0x20
[0xe5801000]   str      r1,[r0,#0]
上面是    PINSEL0 = (PINSEL0 & (~(1<<5)))|(1<<5); 的反汇编“与”操作直接被优化掉了。
为了不让编译器优化,我把PINSEL0 = (PINSEL0 & (~(1<<5)))|(1<<5);改成PINSEL0 = (PINSEL0 & (~(1<<7)))|(1<<5);   
反汇编的结果是:
               PINSEL0 = (PINSEL0 & (~(1<<7)))|(1<<5);
[0xe59f00a4]    ldr      r0,0x40000390 ; = #0xe002c000
[0xe5901000]   ldr      r1,[r0,#0]
[0xe3c11080]   bic      r1,r1,#0x80
[0xe3811020]   orr      r1,r1,#0x20
[0xe5801000]   str      r1,[r0,#0]

也没有出现[0xe3c11080]   bic      r1,r1,#0x80后马上回写到PINSEL0的情况。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

183

帖子

1

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