question0303 发表于 2022-6-30 14:46

硬件报错快速定位方法

在实际调试项目过程中,有时候会进入硬件报错中断,然而代码体量较大时,逐条分析代码不实际,本篇文章就在调试过程中出现硬件报错后,该如何快速定位硬件报错代码的操作进行抛砖引玉。
1.模拟错误代码
使用APM32E103ZET6开发板,并配合附件测试代码模拟错误程序,具体错误操作如下:
volatile unsigned int* testdata1;
unsigned int testdata2;
testdata1 = (unsigned int*)0x12345678;
testdata2 = *testdata1;
(void)testdata2;
如上代码中,testdata2 = *testdata1; 这里对testdata1 地址取值属于对非法地址取值。

2.使用Show Caller Code


如图所示,在发生HardFault后,在<Call Stack+Local>中找到<HardFault_Handler>右键找到<Show Caller Code>可以立即定位到出错代码大致位置。
注意,该方案在代码体量较大时,并不准确。


3.使用MSP/PSP定位出错代码在发生HardFault后,通过查看LR寄存器,若LR=0xFFFF FFF9中bit 2 = 0,表示主堆栈(MSP)包含最近存储的寄存器值。反之,若BIT2=1,则线程堆栈 (PSP)包含最近存储的寄存器值。在本实例中,bit2 =0,则MSP 的值为 0x20000690,在<Memory1>中查看如下图,找到对应LR以及PC的地址,在<Disassembly>中右键找到<Show Code at Address>并输入对应地址,即可以找到对应位置,结合代码逻辑进行分析。
4. 在工程中加载ARM内核故障文件 在原工程代码中加载<HardFaultHandler.s>以及<SEGGER_HardFaultHandler.c>文件,在工程运行到异常故障后,会进入<SEGGER_HardFaultHandler.c>中的<void HardFaultHandler(unsigned int* pStack) >文件后,通过HardFault结构体变量可以具体查看,LR/PC值,以及故障错误类型。






caigang13 发表于 2022-7-1 19:05

谢谢分享经验,学习了。

chenjun89 发表于 2022-7-3 10:06

谢谢楼主分享经验

七毛钱 发表于 2022-7-4 15:54

宝剑锋从磨砺出,感谢楼主分享的宝贵经验

海滨消消 发表于 2022-7-7 09:27

很不错噢,挺有借鉴意义的

MessageRing 发表于 2022-10-4 21:01

感谢楼主的宝贵经验
页: [1]
查看完整版本: 硬件报错快速定位方法