位带到底是什么?——一个 bit 如何映射成一个地址
2026/9/28大约 2 分钟
Cortex-M3 位带到底是什么?——一个 bit 如何映射成一个地址
1. 位带是什么?

位带(Bit-band)就是把一个内存区域中的每一个 bit,都映射成一个独立的 32 位地址。
正常情况下:
uint32_t reg;
reg |= (1 << 3); // 置 bit3
reg &= ~(1 << 3); // 清 bit3本质上是:
读整个字 → 修改其中一个 bit → 写回整个字而位带可以直接通过一个地址:
*(volatile uint32_t *)alias = 1;操作原来的某一个 bit。
2. Cortex-M3 的位带区域

以 SRAM 位带为例:
SRAM Bit-band region
0x20000000 ~ 0x200FFFFF对应的别名区域:
Bit-band alias region
0x22000000 ~ 0x23FFFFFF关系可以理解成:
原始 SRAM 中的 1 个 bit
↓
映射到
↓
Alias 区域中的 1 个 32-bit 地址所以:
一个 bit → 一个可以直接访问的地址
例子
对20000000地址的值进行修改,便成了41,1生效了

使用位带映射,使用22000000进行修改,效果一样的

3. 地址怎么算?
公式:
alias =
0x22000000
+ (addr - 0x20000000) * 32
+ bit * 4;例如:
addr = 0x20000000
bit = 3那么:
alias
= 0x22000000
+ 0
+ 3 × 4
= 0x2200000C访问:
*(volatile uint32_t *)0x2200000C = 1;就相当于:
把 0x20000000 的 bit3 置 1写 0 则清零。
4. 为什么一个 bit 要占 4 字节?
这是位带最容易让人疑惑的地方。
xxxxxxxxxx7 1HardFault2 ↓3硬件自动保存异常现场4 ↓5解析栈中的 PC / LR / xPSR ...6 ↓7定位发生错误的位置text
每一个原始 bit
↓
占用 4 字节的 alias 地址空间例如原始地址 0x20000000:
bit0 → 0x22000000
bit1 → 0x22000004
bit2 → 0x22000008
bit3 → 0x2200000C
...
bit7 → 0x2200001C所以虽然原始对象只有 1 bit,它在别名区域对应的是一个 32-bit 地址访问单元。
这只是地址映射方式,并不是把一个 bit 真正扩展成 32 bit 存储。
5. 位带有什么意义?
关键价值:
可以对单个 bit 进行独立访问,并且硬件保证这种位带访问的原子性。
普通操作:
reg |= (1 << 3);通常需要:
读 → 修改 → 写如果多个执行上下文同时访问,就可能出现竞争。
位带访问则由 Cortex-M 的位带硬件机制完成对应的 bit 操作。
因此特别适合:
标志位
状态位
GPIO控制位
共享bit变量6. 一句话记住
普通访问:
一个地址 → 一整字节/字/半字
位带:
一个地址 → 一个 bit位带的本质不是“让 C 语言支持 bit 地址”,而是 Cortex-M 硬件提供了一套地址映射机制:
把某个内存区域的每一个 bit,映射到别名区域中的一个独立地址。

