You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

排查过程

  1. 查阅ARM官方文档时发现描述冲突:部分文档说明特定类型的未对齐访问会始终触发Fault,另一部分则指出仅当UNALIGN_TRP位(SCB_CCR寄存器第3位)置位时才会触发未对齐访问Fault。
  2. 通过GDB检查SCB_CCR寄存器(地址0xE000ED14),返回值为0x00000201,确认UNALIGN_TRP位未置位,但硬Fault仍发生。
  3. 已验证的临时解决方案:
    • 将goldendata变量声明为static
    • 添加编译选项-mno-unaligned-access

疑问

为何GCC会生成引发硬Fault的数组初始化代码?

内容的提问来源于stack exchange,提问作者ted

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 09:25:03