硬件方面原因:
- 电源设计有错误,造成供电不稳;
- 电源质量不好,纹波噪声过大;
- 器件接触不良;
- 对于带有Vcap 引脚器件,管脚处理不当;
- 电路中有强力干扰源,对器件造成干扰。
软件方面常见原因
- 使用空指针;
- 内存的非对齐访问;
- 数组越界;
- 访问已经释放的内存空间;
- 除数为零;
基于栈回溯分析Hard Fault问题
每个寄存器对应四个字节/
程序执行的时候函数栈包含:触发进入或者中断进入Hard Fault的内存栈,调用函数内存栈,通过这些,可以找到在发生中断瞬间导致触发进入Hard Fault中断的代码指令地址;还有这个函数的返回地址,通过这些可以定位到导致异常的代码地址;和调用关系:
调试除数为零导致程序死机
打开J-Link所在文件选择
放在j-link flash里面打开bin文件
3C0:8个字节后面是LR寄存器内容
3E0:后8个字节是PC寄存器内容
调试空指针导致的死机问题
第一步:打开J-Link Commander
PC:PC寄存器指向当前CPU执行代码对应的指令
SP:指向保存R0内容的内存地址
第二步:在J-Link Flash中打开bin文件
6E0:八个字节后:是LR寄存器的内容
700:后八个字节:是PC寄存器内容(PC正常是08开始,而上图显示00:很明显是空指针的现象)