我真的不知道如何简洁地问这个问题,所以如果这个问题已经被问到并回答,我深表歉意.
我正在一个ARM平台上工作,该平台具有对外围设备先进先出的32位伪寄存器访问权限. 根据读取或写入的大小,会向FIFA中删除或添加可变数量的字节.
我编写了以下C代码来执行16位(半字)读取:
a_u16_var = *(uint16_t*)&FIFO_REG;
并确认它确实导致对象文件中出现ldrh
操作码.
这有保证吗? 如果我对uint32_t
和uint8_t
遵循相同的模式,我可以依赖编译器分别生成ldr
/str
和ldrb
/strb
吗? 如果没有,确保适当大小访问的最佳方法是什么? 在线组装?
编辑:更多平台细节:
- 核心:ARM Cortex-M33(具体来说是STM 32 H563 ZZ)
- 编译器:GNUarm-no-eabi-* 版本11.3.1(用于STM 32 11.3的NU工具)
- 操作系统:FreeRTOS,如果算的话