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方法相比,指令数是一样的,一样需要取出数据赋值,这样可读性还高了.