Q:Hardfault是怎样产生的?
1.调用了空指针
2.内存溢出
内存溢出可以分为两种向上溢出(如堆栈溢出)和向下溢出(如数组越界)。一般产生hardfault的原因,就是你想取的东西在内存中不存在,然后mcu报错。
Q:怎样确定产生Hardfault的原因?
1.用j - link Command 得到R0~R15的寄存器的数据,然后保存ram中的数据到bin文件中
2.在.map文件中找到你的堆栈的站顶和栈底
3.观察command窗口,如果sp超过了栈顶了,那么就是堆栈溢出,一般产生堆栈溢出的原因有这么几个 a. 堆栈设置太小 b. 函数嵌套,中断嵌套
4.如果堆栈没有溢出,那就观察ram.bin文件,对照map文件,看ram中的数据是否正常,最常见的,数组越界时,会发现,ram.bin文件中不该出现数据的地方也出现了数据。其他时候还是要结合代码,map文件和ram.bin文件,查看你的数组是否越界。
5.空指针的情况很好检查,根据sp找到ram.bin文件中的寄存器压栈的具体位置,然后通过压栈的LR寄存器,找到出错的函数。
参考的文档:
https://wenku.baidu.com/view/83337d8e43323968001c9280.html
一周热门 更多>