打印
[ZLG-MCU]

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

[复制链接]
6600|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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。


// 例程A:采用HWREG( )访问外设寄存器

#include  "hw_types.h"

#define  SYSCTL_BASE    0x400FE000              // 定义系统控制模块的基址
#define  RCGC2          (SYSCTL_BASE+0x108)     // 时钟选通控制寄存器2,其位1控制GPIOB

int  main (void)
{
    HWREG(RCGC2) |= 0x00000002;                 // 选通GPIOB的时钟,即使能GPIOB端口
    for (;;);
}


// 例程B:采用Bit-band访问外设寄存器

#include  "hw_types.h"

#define  SYSCTL_BASE    0x400FE000              // 定义系统控制模块的基址
#define  RCGC2          (SYSCTL_BASE+0x108)     // 时钟选通控制寄存器2,其位1控制GPIOB

int  main (void)
{
    HWREGBITW(RCGC2,1) = 1;                     // 选通GPIOB的时钟,即使能GPIOB端口
    for (;;);
}

相关帖子

沙发
AIRWILL| | 2008-1-4 11:08 | 只看该作者

不错

可有访问内部 SRAM 里的状态标志的例程?

使用特权

评论回复
板凳
zlgmcu|  楼主 | 2008-1-4 21:09 | 只看该作者

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

再flash和SRAM中均有Bit-band
可以参考数据手册

使用特权

评论回复
地板
mohanwei| | 2008-1-5 10:23 | 只看该作者

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

使用特权

评论回复
5
ijk| | 2008-1-5 17:13 | 只看该作者

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

使用特权

评论回复
6
AIRWILL| | 2008-1-14 17:03 | 只看该作者

flash 中是没有 Bit-band 的

3 楼犯错误了啦

使用特权

评论回复
7
ijk| | 2008-1-14 21:05 | 只看该作者

LS眼睛厉害

使用特权

评论回复
8
hotpower| | 2008-1-15 23:24 | 只看该作者

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

一直搞不明白为什么用如此多的宏???心里犯嘀咕...

过几天做LM菜鸟时再细研究...郁闷之中~~~

使用特权

评论回复
9
zlgmcu|  楼主 | 2008-1-16 09:02 | 只看该作者

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


“SYSCTL_BASE->RCGC2”形式上是个好东西,没有直接支持,但我们完全可以构造出来(牺牲效率)。

现在定义的RCGC2寄存器是“基址 + 偏移”形式,很自然,也容易理解。

再看HWREGBITW()这个宏操作,用起来方便,但定义形式好复杂:
#define HWREGBITW(x, b)                                                       
        HWREG(((unsigned long)(x) & 0xF0000000) | 0x02000000 |                
              (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2))

但仔细算一算,还真是对的。

使用特权

评论回复
10
kilby| | 2008-1-18 13:58 | 只看该作者

楼上没有细看Datasheet吧

去找个Luminary Datashet看看,里面有写如何做转换:
bit-band alias = bit-band base + (byte offset * 32) + (bit number * 4)
我用的是LM3S6965,见datasheet P.139,HWREGBITW(x, b)正是根据这个来定义的。

另外bit-band的好处还在于其操作是atomic的,也就是读写操作不会有在中间被打断的可能。对于操作系统软件而言,这意味着关键代码的处理上不必像以前一样再需要进行开关中断来做保护,有利于信号量的操作。

使用特权

评论回复
11
ddxx| | 2011-10-9 09:41 | 只看该作者
请问LS,能不能详细解释一下bit band怎么实现信号量操作?谢谢了。

使用特权

评论回复
12
shuaibaobao| | 2011-11-24 13:05 | 只看该作者
内部访问sanmu状态。

使用特权

评论回复
13
zhonghw| | 2014-9-24 15:21 | 只看该作者
感谢楼上各位,学习了~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

81

主题

1146

帖子

0

粉丝