[ZLG-MCU] 关于bit-band的效率(内有例子)??

[复制链接]
 楼主| bigflower 发表于 2008-10-18 12:15 | 显示全部楼层 |阅读模式
变量定义如下:<br />#define&nbsp;false&nbsp;0<br />#define&nbsp;true&nbsp;&nbsp;1<br />#define&nbsp;flag_timer0_a_1ms&nbsp;0<br />extern&nbsp;volatile&nbsp;INT16U&nbsp;timer0_a_Flags;<br />使用HWREGBITW和直接操作两种方式对timer0_a_Flags的最低位置1和置0<br /><br />产生汇编如下,请问BIT-BAND有什么优势??<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;HWREGBITW(&timer0_a_Flags,&nbsp;flag_timer0_a_1ms)=&nbsp;true;//1ms&nbsp;<br />0x000001A2&nbsp;2001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOVS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,#0x01<br />0x000001A4&nbsp;492C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,[pc,#176]&nbsp;&nbsp;;&nbsp;@0x00000258<br />0x000001A6&nbsp;F0014170&nbsp;&nbsp;AND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,r1,#0xF0000000<br />0x000001AA&nbsp;F0417100&nbsp;&nbsp;ORR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,r1,#0x2000000<br />0x000001AE&nbsp;4A2A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,[pc,#168]&nbsp;&nbsp;;&nbsp;@0x00000258<br />0x000001B0&nbsp;F3C20213&nbsp;&nbsp;UBFX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,r2,#0,#20<br />0x000001B4&nbsp;EA411142&nbsp;&nbsp;ORR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,r1,r2,LSL&nbsp;#5<br />0x000001B8&nbsp;6008&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,[r1,#0x00]<br />&nbsp;&nbsp;&nbsp;&nbsp;HWREGBITW(&timer0_a_Flags,&nbsp;flag_timer0_a_1ms)=&nbsp;false;//1ms&nbsp;<br />0x000001BA&nbsp;2000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOVS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,#0x00<br />0x000001BC&nbsp;4926&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,[pc,#152]&nbsp;&nbsp;;&nbsp;@0x00000258<br />0x000001BE&nbsp;F0014170&nbsp;&nbsp;AND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,r1,#0xF0000000<br />0x000001C2&nbsp;F0417100&nbsp;&nbsp;ORR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,r1,#0x2000000<br />0x000001C6&nbsp;4A24&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,[pc,#144]&nbsp;&nbsp;;&nbsp;@0x00000258<br />0x000001C8&nbsp;F3C20213&nbsp;&nbsp;UBFX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,r2,#0,#20<br />0x000001CC&nbsp;EA411142&nbsp;&nbsp;ORR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,r1,r2,LSL&nbsp;#5<br />0x000001D0&nbsp;6008&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,[r1,#0x00]<br />&nbsp;&nbsp;&nbsp;&nbsp;timer0_a_Flags&=~(1&lt&ltflag_timer0_a_1ms);&nbsp;<br />0x000001D2&nbsp;4821&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,[pc,#132]&nbsp;&nbsp;;&nbsp;@0x00000258<br />0x000001D4&nbsp;8800&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDRH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,[r0,#0x00]<br />0x000001D6&nbsp;F0200001&nbsp;&nbsp;BIC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r0,#0x01<br />0x000001DA&nbsp;491F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,[pc,#124]&nbsp;&nbsp;;&nbsp;@0x00000258<br />0x000001DC&nbsp;8008&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STRH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,[r1,#0x00]<br />&nbsp;&nbsp;&nbsp;&nbsp;timer0_a_Flags|=(1&lt&ltflag_timer0_a_1ms);&nbsp;<br />0x000001DE&nbsp;4608&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r1<br />0x000001E0&nbsp;8800&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDRH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,[r0,#0x00]<br />0x000001E2&nbsp;F0400001&nbsp;&nbsp;ORR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r0,#0x01<br />0x000001E6&nbsp;8008&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STRH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,[r1,#0x00]
 楼主| bigflower 发表于 2008-10-18 12:22 | 显示全部楼层

另外对于I/O的置位和反转,可以使用BIT-BAND吗?

  
seeokok 发表于 2008-10-19 15:22 | 显示全部楼层

bit-band有效率,但无法用

&nbsp;&nbsp;&nbsp;&nbsp;关键在timer0_a_Flags编译前无法确定地址,程序运行时需要计算出别名地址,因此无效率可言。<br />&nbsp;&nbsp;&nbsp;&nbsp;如果确定地址,编译后的结果就不同了:<br />#define&nbsp;FlagBase&nbsp;0x20001000<br />#define&nbsp;Testb0&nbsp;HWREGBITW(FlagBase,&nbsp;0)<br />#define&nbsp;Testb1&nbsp;HWREGBITW(FlagBase,&nbsp;1)<br />#define&nbsp;Testb2&nbsp;HWREGBITW(FlagBase,&nbsp;2)<br /><br />#define&nbsp;false&nbsp;0<br />#define&nbsp;true&nbsp;&nbsp;1<br /><br />&nbsp;&nbsp;&nbsp;149&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Testb0=true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00000040&nbsp;&nbsp;&nbsp;1748&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR.N&nbsp;&nbsp;&nbsp;&nbsp;R0,??jtagWait_0+0xC&nbsp;&nbsp;;;&nbsp;0x22020000<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00000042&nbsp;&nbsp;&nbsp;0121&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOVS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R1,#+1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00000044&nbsp;&nbsp;&nbsp;0160&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R1,[R0,&nbsp;#+0]<br /><br />问题是,如此定义的地址,不能保证不会被别的变量覆盖,试过用<br />__no_init&nbsp;uint8&nbsp;Test_bit&nbsp;@&nbsp;FlagBase;<br />指定变量位置,也还是会被别的变量覆盖,我用的是IAR,现在我还没找出一个行之有效的办法。谁有办法请不吝赐教&nbsp;:-P<br /><br />二楼的问题:操作I/O,&nbsp;实际是操作GPIODATA寄存器,它采用地址线屏蔽的方式操作,比BIT-BAND的效率还要高,它可以几个位同时操作而不影响其他位,功能调用GPIOPinWrite就是这样操作的。如果你想要更高的效率,你可以直接对寄存器进行操作:<br />HWREG(ulPort&nbsp;+&nbsp;(ucPins&nbsp;&lt&lt&nbsp;2))&nbsp;=&nbsp;ucVal;<br />这样最少也省了调用函数所花的时间。
 楼主| bigflower 发表于 2008-10-19 21:07 | 显示全部楼层

谢谢,seeokok的答复!!

看来编译器对M3核的支持还有待提高啊!!<br /><br /><br />
zlgmcu 发表于 2008-10-20 15:50 | 显示全部楼层

测试方法直接影响测试结果,楼主的测试手段说明不了什么

请看下面这个例程,位操作仅需一条指令:<br /><br />#include&nbsp;&nbsp;&lthw_types.h&gt<br /><br />#define&nbsp;&nbsp;SYSCTL_BASE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x400FE000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;定义系统控制模块的基址<br />#define&nbsp;&nbsp;RCGC2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(SYSCTL_BASE&nbsp;+&nbsp;0x108)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;定义时钟选通控制寄存器2<br /><br />int&nbsp;main(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;HWREGBITW(RCGC2,&nbsp;1)&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;选通GPIOB模块的时钟<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(;;);<br />}<br />
 楼主| bigflower 发表于 2008-10-22 10:33 | 显示全部楼层

请ZLGMCU留电话,我详细请教,我的mail:bigflower@eyou.com,谢谢!

请ZLGMCU留电话,我详细请教,我的mail:bigflower@eyou.com,谢谢!
AIRWILL 发表于 2008-11-7 17:12 | 显示全部楼层

干吗又要电话

楼主的效率很差,&nbsp;你给个高效率的例子出来给他看看,&nbsp;他一定很聪明,&nbsp;马上就学会的,&nbsp;这问题,&nbsp;电话说不清楚的吧
AIRWILL 发表于 2008-11-7 17:26 | 显示全部楼层

看看我的位变量

下面是一段编译结果,&nbsp;其中&nbsp;ifcwrite,flushem,ifcflash&nbsp;是定义的SRAM&nbsp;中的位变量<br /><br /><br />;;;612&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((ifcwrite)||&nbsp;((!flushem)&nbsp;&&&nbsp;((ifcflash))))&nbsp;&nbsp;{&nbsp;//en<br />000748&nbsp;&nbsp;f892f892&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDRB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,[r2,#0x78];ifcwrite<br />00074c&nbsp;&nbsp;b930&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CBNZ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,|L1.1884|<br />00074e&nbsp;&nbsp;7918&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDRB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,[r3,#4]&nbsp;&nbsp;;&nbsp;flushem<br />000750&nbsp;&nbsp;2800&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,#0<br />000752&nbsp;&nbsp;d150&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BNE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|L1.2038|<br />000754&nbsp;&nbsp;f892f892&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDRB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,[r2,#0x7c]&nbsp;;&nbsp;ifcflash<br />000758&nbsp;&nbsp;2800&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,#0<br />00075a&nbsp;&nbsp;d04c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BEQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|L1.2038|<br /><br /><br />;;;635&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ifbready)&nbsp;{&nbsp;ifwriteq&nbsp;=&nbsp;64;&nbsp;ifcwrite&nbsp;=&nbsp;0;&nbsp;ifcflash&nbsp;=&nbsp;0;&nbsp;}//en<br />0007e4&nbsp;&nbsp;f892f892&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDRB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,[r2,#0x68]<br />0007e8&nbsp;&nbsp;2800&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,#0<br />0007ea&nbsp;&nbsp;d004&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BEQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|L1.2038|<br />0007ec&nbsp;&nbsp;2040&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOVS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,#0x40<br />0007ee&nbsp;&nbsp;70d8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STRB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,[r3,#3]&nbsp;&nbsp;;&nbsp;ifwriteq<br />0007f0&nbsp;&nbsp;f802f802&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STRB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r5,[r2,#0x78]!;&nbsp;ifcwrite<br />0007f4&nbsp;&nbsp;7115&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STRB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r5,[r2,#4]&nbsp;&nbsp;;&nbsp;ifcflash<br />
AIRWILL 发表于 2008-11-7 17:48 | 显示全部楼层

我的位变量定义

#define&nbsp;IFCWRITF&nbsp;30<br />#define&nbsp;IFCFLASH&nbsp;31<br /><br /><br />#define&nbsp;ifcwrite&nbsp;(*((unsigned&nbsp;char&nbsp;*)(SRAM_BITBASE&nbsp;+&nbsp;IFCWRITF&nbsp;*4)))&nbsp;<br />#define&nbsp;ifcflash&nbsp;(*((unsigned&nbsp;char&nbsp;*)(SRAM_BITBASE&nbsp;+&nbsp;IFCFLASH&nbsp;*4)))&nbsp;<br />
zlgmcu 发表于 2008-11-10 15:53 | 显示全部楼层

bit-band效率确实要高些,不过要看你怎么用、怎么认为

bit-band的效率跟编译器有直接的关系,大家都知道<br />如果目标地址是立即数则效率较高,如果是变量则效率低<br />另外要同等条件下比较,如果条件不等同很容易得出相反结论<br />总之,不要冤枉了高效的bit-band操作
AIRWILL 发表于 2008-11-10 21:35 | 显示全部楼层

是的

这只能怪编译器
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

124

帖子

2

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