[ZLG-MCU] 如何才能发挥Bit-band的高效率?——实例分析

[复制链接]
 楼主| zlgmcu 发表于 2007-12-25 14:04 | 显示全部楼层 |阅读模式
AN, gp, IO, GPIO, pi
  请看下面两个例程,实现的功能完全相同,但是例程B的效率要比例程A高。GCC的编译结果是:例程A为24字节,例程B是20字节。采用Bit-band执行速度也快。这就是Bit-band的好处,它非常适合于直接对寄存器当中某一位清零或置位的操作。充分发挥Bit-band效率的前提是寄存器地址、位地址都是已知的常量。如果是变量表达式,对不起,那必须先要计算出地址来,这样造成的低效率可不能归罪于Bit-band。<br /><br /><br />//&nbsp;例程A:采用HWREG(&nbsp;)访问外设寄存器<br /><br />#include&nbsp;&nbsp;&quot;hw_types.h&quot;<br /><br />#define&nbsp;&nbsp;SYSCTL_BASE&nbsp;&nbsp;&nbsp;&nbsp;0x400FE000&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;(SYSCTL_BASE+0x108)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;时钟选通控制寄存器2,其位1控制GPIOB<br /><br />int&nbsp;&nbsp;main&nbsp;(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;HWREG(RCGC2)&nbsp;|=&nbsp;0x00000002;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;选通GPIOB的时钟,即使能GPIOB端口<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(;;);<br />}<br /><br /><br />//&nbsp;例程B:采用Bit-band访问外设寄存器<br /><br />#include&nbsp;&nbsp;&quot;hw_types.h&quot;<br /><br />#define&nbsp;&nbsp;SYSCTL_BASE&nbsp;&nbsp;&nbsp;&nbsp;0x400FE000&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;(SYSCTL_BASE+0x108)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;时钟选通控制寄存器2,其位1控制GPIOB<br /><br />int&nbsp;&nbsp;main&nbsp;(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;HWREGBITW(RCGC2,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;选通GPIOB的时钟,即使能GPIOB端口<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(;;);<br />}<br />
AIRWILL 发表于 2008-1-4 11:08 | 显示全部楼层

不错

可有访问内部&nbsp;SRAM&nbsp;里的状态标志的例程?
 楼主| zlgmcu 发表于 2008-1-4 21:09 | 显示全部楼层

将上面的地址改变成SRAM就可以了

再flash和SRAM中均有Bit-band<br />可以参考数据手册
mohanwei 发表于 2008-1-5 10:23 | 显示全部楼层

从51走过来的人可能会大乐(可以位清零也算优势?),呵呵

  
ijk 发表于 2008-1-5 17:13 | 显示全部楼层

这就是RISC机跟CISC机(51)的区别了~~

  
AIRWILL 发表于 2008-1-14 17:03 | 显示全部楼层

flash 中是没有 Bit-band 的

3&nbsp;楼犯错误了啦
ijk 发表于 2008-1-14 21:05 | 显示全部楼层

LS眼睛厉害

  
hotpower 发表于 2008-1-15 23:24 | 显示全部楼层

能否用类似SYSCTL_BASE->RCGC2来表示???

一直搞不明白为什么用如此多的宏???心里犯嘀咕...<br /><br />过几天做LM菜鸟时再细研究...郁闷之中~~~
 楼主| zlgmcu 发表于 2008-1-16 09:02 | 显示全部楼层

的确,我初学是也是在嘀咕,但适应就好

<big><br />“SYSCTL_BASE-&gtRCGC2”形式上是个好东西,没有直接支持,但我们完全可以构造出来(牺牲效率)。<br /><br />现在定义的RCGC2寄存器是“基址&nbsp;+&nbsp;偏移”形式,很自然,也容易理解。<br /><br />再看HWREGBITW()这个宏操作,用起来方便,但定义形式好复杂:<br />#define&nbsp;HWREGBITW(x,&nbsp;b)&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HWREG(((unsigned&nbsp;long)(x)&nbsp;&&nbsp;0xF0000000)&nbsp;|&nbsp;0x02000000&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(((unsigned&nbsp;long)(x)&nbsp;&&nbsp;0x000FFFFF)&nbsp;&lt&lt&nbsp;5)&nbsp;|&nbsp;((b)&nbsp;&lt&lt&nbsp;2))<br /><br />但仔细算一算,还真是对的。<br /></big>
kilby 发表于 2008-1-18 13:58 | 显示全部楼层

楼上没有细看Datasheet吧

去找个Luminary&nbsp;Datashet看看,里面有写如何做转换:<br />bit-band&nbsp;alias&nbsp;=&nbsp;bit-band&nbsp;base&nbsp;+&nbsp;(byte&nbsp;offset&nbsp;*&nbsp;32)&nbsp;+&nbsp;(bit&nbsp;number&nbsp;*&nbsp;4)<br />我用的是LM3S6965,见datasheet&nbsp;P.139,HWREGBITW(x,&nbsp;b)正是根据这个来定义的。<br /><br />另外bit-band的好处还在于其操作是atomic的,也就是读写操作不会有在中间被打断的可能。对于操作系统软件而言,这意味着关键代码的处理上不必像以前一样再需要进行开关中断来做保护,有利于信号量的操作。
ddxx 发表于 2011-10-9 09:41 | 显示全部楼层
请问LS,能不能详细解释一下bit band怎么实现信号量操作?谢谢了。
shuaibaobao 发表于 2011-11-24 13:05 | 显示全部楼层
内部访问sanmu状态。
zhonghw 发表于 2014-9-24 15:21 | 显示全部楼层
感谢楼上各位,学习了~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

81

主题

1146

帖子

0

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

81

主题

1146

帖子

0

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