完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
单片机一般是cortex-m3/m4/m0之类的内核,典型的就是stm32,其实其他内核也是一个道理。hardfault错误一般是操作了不该操作的内存,或者执行了不该执行的动作,例如一个非法的函数指针,你非要去调用。
调试这个错误的原理是: 发生hardfault错误后就会进入相应的hardfault中断,进入中断前会在被中断的地址执行压栈动作,将当时的工作环境(就是系统的一些寄存器,r0,r1,r2,r3,lr,pc,r12)压进堆栈,将lr赋值非法数据,然后跳到hardfault中断执行中断服务程序。那么只需要将压栈后的lr读出来,就知道中断服务程序的返回地址,也就是出现hardfault时的程序地址,也就是错误的代码地址。 直接看代码: /** * @brief This function handles Hard Fault exception. * @param None * @retval None */ void HardFault_Handler_C(unsigned int* hardfault_args) { printf("rnsp =0x%.8Xrn",hardfault_args); printf("R0 = 0x%.8Xrn",hardfault_args[0]); printf("R1 = 0x%.8Xrn",hardfault_args[1]); printf("R2 = 0x%.8Xrn",hardfault_args[2]); printf("R3 = 0x%.8Xrn",hardfault_args[3]); printf("R12 = 0x%.8Xrn",hardfault_args[4]); printf("LR = 0x%.8Xrn",hardfault_args[5]); printf("PC = 0x%.8Xrn",hardfault_args[6]); printf("PSR = 0x%.8Xrn",hardfault_args[7]); printf("BFAR = 0x%.8Xrn",*(unsigned int*)0xE000ED38); printf("CFSR = 0x%.8Xrn",*(unsigned int*)0xE000ED28); printf("HFSR = 0x%.8Xrn",*(unsigned int*)0xE000ED2C); printf("DFSR = 0x%.8Xrn",*(unsigned int*)0xE000ED30); printf("AFSR = 0x%.8Xrn",*(unsigned int*)0xE000ED3C); printf("SHCSR = 0x%.8Xrn",SCB->SHCSR); while (1); } #undef TST __ASM void HardFault_Handler_a(void) { IMPORT HardFault_Handler_C TST LR, #4 ITE EQ MRSEQ R0, MSP MRSNE R0, PSP B HardFault_Handler_C } void HardFault_Handler(void) { /* Go to infinite loop when Hard Fault exception occurs */ HardFault_Handler_a(); printf("HardFault_Handlerrn"); while (1) { } } HardFault_Handler_a这个函数里面执行过程是:判断lr的值,判断是从msp还是psp中去读堆栈数据,将堆栈指针赋给r0,然后调用HardFault_Handler_C这个函数 HardFault_Handler_C执行过程:就是从堆栈中将堆栈的数据打印出来,重点关注lr 拿到lr以后,打开keil,一半都不习惯使用硬件的jtag,所以设置下软件模拟,目的只是为了看反汇编代码 然后进入调试模式,出现了反汇编代码,在反汇编代码里面右键-"show code at address"-输入刚才得到的lr数值,就跳到出问题的那个代码了! |
|
|
|
只有小组成员才能发言,加入小组>>
3314 浏览 9 评论
2995 浏览 16 评论
3494 浏览 1 评论
9059 浏览 16 评论
4088 浏览 18 评论
1178浏览 3评论
605浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
599浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2335浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1896浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 12:21 , Processed in 1.103515 second(s), Total 50, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号