Keil Bitband 使用方便方法

/ 0评 / 2

BITBAND是一种给Cortex-M3/M4的优化操作内存,寄存器的方法.就以LPC1788来说,他就是M3的,他支持BITBAND,但是网上大多数用的是宏计算地址,这样麻烦费时费力.可读性也一般般.
bitband作用范围有哪些,外设最低1MB,内存最低1MB,很笼统,我画了图标了一下,涂了颜色的都是支持bitband的.
可以说是所有外设都支持bitband.

但是RAM部分就没那么幸福.只有顶端的0x2007C000 - 0x20083FFF是可以映射的.
传统方法经过一条公示,但是我又记不住,又不想分析程序太难.就用Keil自带关键字吧.
http://www.keil.com/support/man/docs/armcc/armcc_chr1359124979689.htm
首先我把GPIO的结构复制了一份,先改名成这样.

然后继续改成:

typedef struct {
  uint32_t M0 : 1;
  uint32_t M1 : 1;
  uint32_t M2 : 1;
  uint32_t M3 : 1;
  uint32_t M4 : 1;
  uint32_t M5 : 1;
  uint32_t M6 : 1;
  uint32_t M7 : 1;
  uint32_t M8 : 1;
  uint32_t M9 : 1;
  uint32_t M10 : 1;
  uint32_t M11 : 1;
  uint32_t M12 : 1;
  uint32_t M13 : 1;
  uint32_t M14 : 1;
  uint32_t M15 : 1;
  uint32_t M16 : 1;
  uint32_t M17 : 1;
  uint32_t M18 : 1;
  uint32_t M19 : 1;
  uint32_t M20 : 1;
  uint32_t M21 : 1;
  uint32_t M22 : 1;
  uint32_t M23 : 1;
  uint32_t M24 : 1;
  uint32_t M25 : 1;
  uint32_t M26 : 1;
  uint32_t M27 : 1;
  uint32_t M28 : 1;
  uint32_t M29 : 1;
  uint32_t M30 : 1;
  uint32_t M31 : 1;
} uint32_t_BitBand __attribute__((bitband));
typedef struct
{
  __IO uint32_t_BitBand DIR;
       uint32_t RESERVED0[3];
  __IO uint32_t_BitBand MASK;
  __IO uint32_t_BitBand PIN;
  __IO uint32_t_BitBand SET;
  __O  uint32_t_BitBand CLR;
} LPC_GPIO_BitBand_TypeDef;

然后给GPIO添加一个别名.

然后把语句改掉.

可见指令已经大幅缩减.新方法对应汇编.

LDR      r0,[pc,#540]  ; 从PC+540位置取出数据加载到R0
STR      r3,[r0,#0x00]  ; 把R0+0为地址的数据存到R3指向的地址

旧方法读改写.

LDR      r1,[pc,#456]
LDR      r1,[r1,#0x40]
BIC      r1,r1,#0x200000
LDR      r2,[pc,#448]
STR      r1,[r2,#0x40]

跟define方法相比,指令数是一样的,一样需要取出数据赋值,这样可读性还高了.

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注