Airwill的笔记 https://passport2.21ic.com/?5782 [收藏] [复制] [RSS]

日志

关于 bitband 的效率

已有 2057 次阅读2010-4-19 06:33 |系统分类:ARM| 单片机

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 */


 


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)