如果是代码非对齐访问就好解决了,修改代码就可以修正,但我碰到的是优化时的合并操作,非常容易复现,比如下面代码:
[C] 纯文本查看 复制代码 /*******************************************************************************
* @brief: var
******************************************************************************/
struct mem_atst
{
uint32_t u32_v0;
uint8_t u08_v0;
uint8_t u08_v1;
uint8_t u08_v2;
uint8_t u08_v3;
uint8_t u08_v4;
uint8_t u08_v5;
uint8_t u08_v6;
uint8_t u08_v7;
};
struct mem_atst atst_obj;
extern struct mem_atst atst_obj;
/*******************************************************************************
* @brief: tst
******************************************************************************/
void mem_alain_tst(void)
{
atst_obj.u08_v1 = 3;
atst_obj.u08_v2 = 0;
}
编译后查看汇编窗口如下:
执行 mem_alain_tst()函数中的两个字节变量赋值。
本应该是两条 STRB(字节存储)指令完成,编译器给合并成一条STRH(半字存储)指令完成。
根据汇编结果看,目标操作数地址偏移量#5,这个地址是没有对齐到半字的,因此引发Hardfault。
|