该问题通常是由于 ldr.w 指令所访问的地址未对齐引起的。在 ARM Cortex-M7 上,指令必须对齐到其大小的边界,即 2 字节对齐的半字(half-word)、4 字节对齐的字(word)或 8 字节对齐的双字(double-word)。访问未对齐地址会导致硬件异常。
要解决此问题,可以通过使用 __packed 关键字来手动指定结构体或联合体的对齐方式。例如:
typedef __packed struct { uint32_t var1; uint8_t var2; } MyStruct;
现在,MyStruct 的大小将是 5 个字节(4 个字节的 var1 和 1 个字节的 var2),而不是默认的 8 个字节(4 个字节对齐 + 1 个字节 + 3 个填充字节)。
或者,可以使用 attribute((aligned(n))) 来指定函数、变量或指针的对齐方式。例如:
static uint8_t attribute((aligned(2))) myByteArray[5];
现在,myByteArray 的大小将保持不变(5 个字节),但是它将按 2 字节对齐。
确保要访问的地址按正确的方式对齐是解决此问题的关键。