[技术手册] arm单片机的位带操作原理

[复制链接]
 楼主| kkzz 发表于 2025-2-27 09:00 | 显示全部楼层 |阅读模式
单片机单片机的位带操作(Bit-Banding)是一种特殊的内存映射技术,允许开发者以原子操作的方式对特定的内存位进行读写,从而提高了对GPIO端口、寄存器以及其他外设单个位的操作效率。



1、位带区与位带别名区

单片机单片机的内存空间分为位带区和位带别名区。
位带区包括SRAM区的最低1MB(地址范围0x2000_0000-0x200F_FFFF)和片内外设区的最低1MB(地址范围0x4000_0000-0x400F_FFFF)。
位带别名区将位带区中的每个位映射到一个32位的字,实现了从按字节寻址到按位寻址的转变。

2、地址映射关系
位带别名区中的每个字都对应到位带区的一个位。
映射公式为:bit_word_addr = bit_band_base + (byte_offset × 32) + (bit_number × 4)。
bit_word_addr:别名存储器区中字的地址。
bit_band_base:别名区的起始地址(SRAM位带别名区起始地址为0x22000000,外设位带别名区起始地址为0x42000000)。
byte_offset:包含目标位的字节在位带区中的序号。
bit_number:目标位所在位置(0-31)。

3、位带操作的优势
提高了代码的可读性和执行效率,尤其是对GPIO端口和寄存器的单个位进行操作时。
实现了原子操作,避免了多线程或中断环境下可能出现的竞态条件和数据不一致性问题。
简化了对硬件I/O密集型底层程序的操作,以及对大范围使用位标志的系统程序的管理。

4、C语言中的位带操作

在C语言中,使用宏定义来实现位带操作。
通过定义将“位带地址+位序号”转换成别名地址的宏,以及将别名地址转换成指针类型的宏,可以在C代码中方便地进行位带操作。
示例宏定义:
#define BITBAND(addr, bitnum) ((addr & 0xF0000000) + 0x2000000 + ((addr & 0xFFFFF) << 5) + (bitnum << 2))
#define MEM_ADDR(addr) *((volatile unsigned long *) (addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
使用volatile关键字定义要访问的变量,以确保编译器每次都如实地把新数值写入存储器。

tpgf 发表于 2025-3-1 13:26 | 显示全部楼层
ARM单片机的位带操作是一种高效的内存访问技术,它允许开发者直接对单个比特位进行操作,而无需进行复杂的位运算
heimaojingzhang 发表于 2025-3-2 13:25 | 显示全部楼层
位带区域是通过将一块内存映射到特定的地址区间,来允许对单个位进行直接的读取或写入操作
keaibukelian 发表于 2025-3-2 15:19 | 显示全部楼层
每个比特位的访问都对应着一个完整的内存单元(通常是32位),但实际上位带区域允许程序访问到这个32位单元中的每一个单独的比特位
paotangsan 发表于 2025-3-2 17:08 | 显示全部楼层
传统的位操作需要一定的计算资源和时间,而位带操作直接映射到内存地址,通过简单的读写就可以操作单个位,从而提高了效率
renzheshengui 发表于 2025-3-2 18:57 | 显示全部楼层
对于需要频繁修改单个比特位的场景,位带操作能够减少CPU的负担,避免每次都做复杂的位运算
wowu 发表于 2025-3-2 20:44 | 显示全部楼层
传统位操作的代码需要编写掩码、位移等较为复杂的逻辑,而位带操作提供了直接操作位的方式,简化了代码的编写
小小蚂蚁举千斤 发表于 2025-3-13 22:26 | 显示全部楼层
在C语言中,使用宏定义来实现位带操作
您需要登录后才可以回帖 登录 | 注册

本版积分规则

332

主题

11219

帖子

13

粉丝
快速回复 在线客服 返回列表 返回顶部