请看下面两个例程,实现的功能完全相同,但是例程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 (;;); }
|