||
2007-11-7
本来, thumb2 指令设计的bitband 技术, 本来为了提供一个很高效率的位处理, 可是, 看看让这个处理的结果
;;40 SRAMBITW(&xuc, 1) ^= 1;
000072 4a0e LDR r2,|L1.172|
000074 4f0d LDR r7,|L1.172|
000076 1d12 ADDS r2,r2,#4
000078 1d3f ADDS r7,r7,#4
00007a f002 4270 AND r2,r2,#0xf0000000
00007e f3c7 0713 UBFX r7,r7,#0,#20
000082 ea42 1247 ORR r2,r2,r7,LSL #5
000086 4f0e LDR r7,|L1.192|
000088 433a ORRS r2,r2,r7
00008a 6817 LDR r7,[r2,#0]
00008c f087 0701 EOR r7,r7,#1
000090 6017 STR r7,[r2,#0]
要这么多指令才完成这个这么一个处理!
这结果, 真是失落!
2007-11-21
今天找到了. 资料称 __at 或者 __attribute__((at(0xXXXX)));
然后直接定义位变量的地址.
#define flagA HWREG(0x22000000+0xXXXX*32+A) // A为位地址 0~31
2010-02-19
MDK RV4.0 完全支持 bitband 看下面手册上的介绍
使用 __attribute__((bitband))
__attribute__((bitband)) 是用于对结构的类型定义进行位处理操作的类型属性。
示例 4-4 未定位的对象
/* foo.c */
typedef struct {
int i : 1;
int j : 2;
int k : 3;
} BB __attribute__((bitband));
BB value; // Unplaced object
void update_value(void)
{
value.i = 1;
value.j = 0;
}
/* end of foo.c */