在GCC的C/C++中如何通过内置函数实现ARM的strb字节存储?
在GCC编译的ARM架构C/C++代码中触发strb指令的方法
当然有办法实现,以下是两种可靠的方式:
强制类型转换为volatile uint8_t指针
如果你的外设寄存器(比如USART1->TDR)被定义为32位类型,直接赋值会触发32位的str指令。但通过将寄存器地址强制转换为8位volatile指针,就能让GCC生成字节存储的strb指令:*(volatile uint8_t *)&USART1->TDR = 0x01;这里的
volatile至关重要,它告诉编译器必须执行实际的内存写入操作,不能因为优化省略或调整这个存储动作,这对内存映射的外设寄存器来说是必须的。使用GCC ARM内置函数__builtin_stb
GCC针对ARM架构提供了专门的内置内存操作函数,其中__builtin_stb就是用来生成strb指令的:__builtin_stb(0x01, &USART1->TDR, 0);函数参数依次是:要存储的字节值、目标地址、地址偏移量(这里填0表示直接写入目标地址的第一个字节)。这个方法更直接明确,不需要类型转换,不过要注意它是ARM目标特有的内置函数,仅在编译ARM架构代码时可用。
需要注意的是,无论哪种方式,都要确保操作的是正确的寄存器地址——外设寄存器的字节偏移要符合手册定义,避免因地址错误导致的操作失效。
内容的提问来源于stack exchange,提问作者wimalopaan
相关产品推荐
相关产品推荐

