在实际调试项目过程中,有时候会进入硬件报错中断,然而代码体量较大时,逐条分析代码不实际,本篇文章就在调试过程中出现硬件报错后,该如何快速定位硬件报错代码的操作进行抛砖引玉。
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值,以及故障错误类型。
|