为何GCC为ARMv8 Cortex-M33生成的数组初始化会引发硬fault?
ARMv8 Cortex-M33(STM32U5)未对齐访问硬Fault问题
问题场景
我正在基于ARMv8架构的STM32U5(Cortex-M33内核)搭建嵌入式系统,编译以下代码时触发了未对齐访问导致的硬Fault:
void test_ram() { const uint8_t goldendata[16] = { 0xde, 0xad, 0xba, 0xbe, 0, 0x55, 0x55, 0xaa, 0xaa, 0, 0xff, 0xff }; (void) goldendata; }
硬Fault发生在数组初始化阶段,通过Godbolt可观察到GCC生成了未对齐访问的指令。使用的编译参数如下:
-std=c11 -ggdb -ffunction-sections -O0 -ggdb -ffunction-sections -O0 -Wall -mcpu=cortex-m33 -mthumb -mfpu=fpv5-sp-d16 -mfloat-abi=hard
排查过程
- 查阅ARM官方文档时发现描述冲突:部分文档说明特定类型的未对齐访问会始终触发Fault,另一部分则指出仅当
UNALIGN_TRP位(SCB_CCR寄存器第3位)置位时才会触发未对齐访问Fault。 - 通过GDB检查SCB_CCR寄存器(地址
0xE000ED14),返回值为0x00000201,确认UNALIGN_TRP位未置位,但硬Fault仍发生。 - 已验证的临时解决方案:
- 将
goldendata变量声明为static - 添加编译选项
-mno-unaligned-access
- 将
疑问
为何GCC会生成引发硬Fault的数组初始化代码?
内容的提问来源于stack exchange,提问作者ted
相关产品推荐
相关产品推荐

