出现的原因:
1、堆栈溢出
一、局部变量不要使用太多,尤其是局部大数组,最是杀堆栈的;
二、函数调用纵深不要太大;
三、尽量给堆栈留有余地;
2、数组越界
3、非法指针
可以打印堆栈的指针,在将进入中断之前,保存了LR值到堆栈的处正偏移20字节处,即发生错误的下一条指令。我们可以根据lr的值确定错误发生的位置。
在调试模式,打开反汇编窗口,右击菜单选择show disassemble at address选项,输入lr打印的地址,点击go to,就定位到了错误的位置。
void HardFault_Handler(void)
{
/* Go to infinite loop when Hard Fault exception occurs */
u32 r_sp;
r_sp = __get_MSP();//获取堆栈指针
Debug_printf(“ERR:SP->0x%x\n”,r_sp);
Debug_printf(“LR->0x%x\n”, ((u32)(r_sp+20)));
while (1)
{
}