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; //使用位帶別名地址