Cortex-M3 Bit-Banding

Cortex-M3 Bit-Banding

1. 概述

CM3的存儲器系統支持所謂的「位帶」(bit-band)操做。
經過它,實現了對單一bit的原子操做。位帶操做僅適用於一些特殊的存儲器區域中。
位帶區與位帶別名區對應關係併發

從彙編角度看:
bitbanding對應關係彙編角度
與傳統方法的比較:
與傳統方法的比較
在位帶區中,每一個比特都映射到別名地址區的一個字——這是個只有 LSB纔有效的字。優化

支持位帶操做的兩個內存區的範圍是:
0x2000_0000-0x200F_FFFF(SRAM區中的最低 1MB)
0x4000_0000-0x400F_FFFF(片上外設區中的最低1MB)
指針

2. 優勢

  • 位帶操做對於硬件 I/O密集型的底層程序最有用處了;
  • 位帶操做還能用來化簡跳轉的判斷。
    當跳轉依據是某個位時,之前必須這樣作:
    讀取整個寄存器
    掩蔽不須要的位
    比較並跳轉
    如今只需:
    從位帶別名區讀取狀態位
    比較並跳轉
  • 位帶操做還有一個重要的好處是在多任務中,用於實現共享資源在任務間的「互鎖」訪問;
    多任務的共享資源必須知足一次只有一個任務訪問它——亦即所謂的「原子操做」。
    之前的讀-改-寫須要 3 條指令,致使這中間留有兩個能被中斷的空當。
    因而可能會出現以下圖所示的紊亂危象:
    多任務操做非原子訪問
    一樣的紊亂危象能夠出如今多任務的執行環境中.其實,上圖所演示的狀況能夠看做是多任
    務的一個特例:主程序是一個任務,ISR是另外一個任務,這兩個任務併發執行。
    經過使用 CM3的位帶操做,就能夠消滅上例中的紊亂危象。CM3把這個「讀-改-寫」作成一
    個硬件級別支持的原子操做,不能被中斷,以下圖:
    bit-banding原子操做

3. 其它數據長度上的位帶操做

位帶操做並不僅限於以字爲單位的傳送。亦能夠按半字和字節爲單位傳送。例如,可使用
LDRB/STRB來以字節爲長度單位去訪問位帶別名區,同理可用於 LDRH/STRH。可是無論用哪個對
子,都必須保證目標地址對齊到字的邊界上。code

4. 在 C語言中使用位帶操做

//把「位帶地址+位序號」轉換成別名地址的宏
#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; //使用位帶別名地址

請注意:當使用位帶功能時,要訪問的變量必須用 volatile來定義。由於 C編譯器並不知道同一個比特能夠有兩個地址。因此就要經過 volatile,使得編譯器每次都如實地把新數值寫入存儲器,而再也不會出於優化的考慮,在中途使用寄存器來操做數據的副本,直到最後才把副本寫回——這會致使按不一樣的方式訪問同一個位會獲得不一致的結果(可能被優化到不一樣的寄存器來保存中間結果——譯註)

相關文章
相關標籤/搜索