C 代码如何利用 Cortex M4 的未对齐 4 字节存储指令?
*(int*)p = x
大部分都有效,但偶尔我会得到这样的结果:
void Store(uint8_t* p, uint32_t a, uint32_t b)
{
*(uint32_t*)(p + 0) = a;
*(uint32_t*)(p + 4) = b;
}
which
gcc
然后编译为:
00000000 <Store>:
0: e9c0 1200 strd r1, r2, [r0]
4: 4770 bx lr
6: bf00 nop
这当然会给出
HardFault
,因为 8 字节存储必须对齐。有没有办法编写存储以便 gcc 知道它们可以不对齐?也许有未对齐的 int 类型?
两种有效的方法是
memcpy
,以及定义未对齐的 int 结构,例如
typedef struct
{
uint8_t d[4];
} my_uint32_t;