打印

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

[复制链接]
1967|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 电子菜鸟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
好像没错,我回去看下书,再回复你

使用特权

评论回复
5
电子菜鸟435|  楼主 | 2009-11-13 09:33 | 只看该作者
本帖最后由 电子菜鸟435 于 2009-11-13 09:36 编辑


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

使用特权

评论回复
6
liliang9554| | 2009-11-13 18:54 | 只看该作者
嗯,学习到不少东西

使用特权

评论回复
7
wuzx-61| | 2009-11-13 19:42 | 只看该作者
还在学汇编,正准备转向C,敬候!

使用特权

评论回复
8
电子菜鸟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

粉丝