CM3的存储器系统支持所谓的“位带”(bit-band)操做。
经过它,实现了对单一bit的原子操做。位带操做仅适用于一些特殊的存储器区域中。
并发
从汇编角度看:
与传统方法的比较:
在位带区中,每一个比特都映射到别名地址区的一个字——这是个只有 LSB才有效的字。优化
支持位带操做的两个内存区的范围是:
0x2000_0000-0x200F_FFFF(SRAM区中的最低 1MB)
0x4000_0000-0x400F_FFFF(片上外设区中的最低1MB) 指针
位带操做并不仅限于以字为单位的传送。亦能够按半字和字节为单位传送。例如,可使用
LDRB/STRB来以字节为长度单位去访问位带别名区,同理可用于 LDRH/STRH。可是无论用哪个对
子,都必须保证目标地址对齐到字的边界上。code
//把“位带地址+位序号”转换成别名地址的宏 #define BITBAND(addr, bitnum) ((addr & 0xF0000000) + 0x20000000 + ((addr & 0xFFFFF) << 5) + (bit<<2)); //把该地址转换成一个指针 #define MEM_ADDR(addr) *((volatile unsigned long *) (adr));
在此基础上,咱们就能够以下改写代码:内存
MEM_ADDR(DEVICE REG0) = 0xAB; //使用正常地址访问寄存器,即把0xAB做为DEVICE REG0地址上的值 MEM_ADDR(DEVICE_REG0) = MEM_ADDR(DEVICE_REG0) | 0x2; //传统作法 MEM_ADDR(BITBAND(DEVICE_REG0, 1)) = 0x1; //使用位带别名地址