Cortex-M3/M4 不可屏蔽硬件异常处理之非法内存访问
记录使用 RT-Thread 开发 STM32F407 期间出现的硬件异常错误、排查思路及相关内容合集。
一、问题
aht10_thread栈空间余量充足排除堆栈溢出,继续根据报错信息进行排除。
那么SCB是什么,SCB_CFS_BFSR、SCB->BFAR又是什么?
根据ARM32标准4GB内存空间分配如下,可见SBC为系统控制块其中包含了各个系统控制寄存器。
查看程序可以找到Cotex-M4的SBC基地址定义,如下:
PRECISERR SCB->BFAR:BB000010,代表在0xBB000010内存地址出现了非法访问,显然0xBB000010不在我们所能访问的内存访问内。 -->
结论PC值指向出错指令
scb_cfsr_bfsr:0x82 --> 1000 0010 对应MFSR/MMFSR寄存器 -->
结论PC值指向出错指令
关闭debug编译优化等级 -O0
复现错误,但是无法单步执行到具体位置,函数反复横跳,全速运行报错才会出现。
直接根据报错信息PC
寄存器和LR
寄存器,查看.map映射,可以发现是在函数lv_obj_get_event_dsc
期间出现错误,上级调用为event_send_code
,最终能够给到应用层调用的只有lv_event_send
函数,故排除一切有调用lv_event_send的地方。
lv_res_t lv_event_send(lv_obj_t * obj, lv_event_code_t event_code, void * param);
static lv_res_t event_send_core