程序出现了“HardFault_Handler”问题有什么快速的查找方法

IT挖矿工 2011-11-08 09:56:35
我用的是NXP的LPC1766,编译环境用的是TKStudio,其实就是调用的Keil,调试时候发现程序死在了“HardFault_Handler”这个地方,堆栈里面也没有上次调用的那个函数,导致我无法定位到出错的位置,请问下各位大大们有木有什么解决方法?
...全文
1460 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
IT挖矿工 2011-11-18
  • 打赏
  • 举报
回复
问题找到了,是由于堆栈设的太小导致的,改大了之后就OK了
dceacho 2011-11-13
  • 打赏
  • 举报
回复
我最近也碰到过好多次
不过,把仿真器机实验班断电一会再开就又好了,实在找不出原因
ffeige1984 2011-11-08
  • 打赏
  • 举报
回复
HardFault_Handler 一般是有数据溢出引起的 ,比如数据越界
给你个查看问题的思路吧:
*.s
HardFault_Handler\
PROC
; EXPORT HardFault_Handler [WEAK]
; B .

IMPORT hard_fault_handler_c
TST LR, #4
ITE EQ
MRSEQ R0, MSP
MRSNE R0, PSP
B hard_fault_handler_c
ENDP


*.c
void hard_fault_handler_c(unsigned int * hardfault_args)
{
/* Go to infinite loop when Hard Fault exception occurs */

unsigned int stacked_r0;
unsigned int stacked_r1;
unsigned int stacked_r2;
unsigned int stacked_r3;
unsigned int stacked_r12;
unsigned int stacked_lr;
unsigned int stacked_pc;
unsigned int stacked_psr;

stacked_r0 = ((unsigned long) hardfault_args[0]);
stacked_r1 = ((unsigned long) hardfault_args[1]);
stacked_r2 = ((unsigned long) hardfault_args[2]);
stacked_r3 = ((unsigned long) hardfault_args[3]);

stacked_r12 = ((unsigned long) hardfault_args[4]);
stacked_lr = ((unsigned long) hardfault_args[5]);
stacked_pc = ((unsigned long) hardfault_args[6]);
stacked_psr = ((unsigned long) hardfault_args[7]);

printf ("[Hard fault handler]\r\n");
printf("R0 = %x\r\n", stacked_r0);
printf ("R1 = %x\r\n", stacked_r1);
printf ("R2 = %x\r\n", stacked_r2);
printf ("R3 = %x\r\n", stacked_r3);
printf ("R12 = %x\r\n", stacked_r12);
printf ("LR = %x\r\n", stacked_lr);
printf ("PC = %x\r\n", stacked_pc);
printf ("PSR = %x\r\n", stacked_psr);
printf ("BFAR = %x\r\n", (*((volatile unsigned long *)(0xE000ED38))));
printf ("CFSR = %x\r\n", (*((volatile unsigned long *)(0xE000ED28))));
printf ("HFSR = %x\r\n", (*((volatile unsigned long *)(0xE000ED2C))));
printf("DFSR = %x\r\n", (*((volatile unsigned long *)(0xE000ED30))));
printf("AFSR = %x\r\n", (*((volatile unsigned long *)(0xE000ED3C))));
while (1)
{
}
}

这样把出错前的寄存器打印出来 看从那进入的
woshi_ziyu 2011-11-08
  • 打赏
  • 举报
回复
还是看看哪里导致了这个问题
noodle123 2011-11-08
  • 打赏
  • 举报
回复
应该是意外复位了。可能访问了不正确的地址。具体不知道。。。
1、你可以猜测一下,或者从最开始开始设断点,一步一步往下走,看看在什么地方会死——缩小调试范围法。
2、另一个情况就是还没有启动就死了,所以堆栈里面根本就没有上次的调用。
3、还有一种情况就是代码导致堆栈异常,所以里面也恰巧看不到了。
没用过的猜想一下,期待更好的答案。

27,383

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧