定位cortex-m3的hard fault的方法

[复制链接]
7722|13
 楼主| 李富贵 发表于 2011-12-17 17:13 | 显示全部楼层 |阅读模式
1,  用Keil的话,可以这样:

先将fault中断函数的内容改为:

  

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

  

  

然后在源程序里添加下面的函数代码:

// hard fault handler in C,   

// with stack frame location as input parameter   

void hard_fault_handler_c(unsigned int * hardfault_args)   

{   

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]\n");   

printf ("R0 = %x\n", stacked_r0);   

printf ("R1 = %x\n", stacked_r1);   

printf ("R2 = %x\n", stacked_r2);   

printf ("R3 = %x\n", stacked_r3);   

printf ("R12 = %x\n", stacked_r12);   

printf ("LR = %x\n", stacked_lr);   

printf ("PC = %x\n", stacked_pc);   

printf ("PSR = %x\n", stacked_psr);   

printf ("BFAR = %x\n", (*((volatile unsigned long *)(0xE000ED38))));   

printf ("CFSR = %x\n", (*((volatile unsigned long *)(0xE000ED28))));   

printf ("HFSR = %x\n", (*((volatile unsigned long *)(0xE000ED2C))));   

printf ("DFSR = %x\n", (*((volatile unsigned long *)(0xE000ED30))));   

printf ("AFSR = %x\n", (*((volatile unsigned long *)(0xE000ED3C))));   

  

   

while(1)

{

        ;;

}

  

}   

  

如果使用调试器,则可以在第一个printf处设置断点.没有的话看串口打印结果

通过查看stacked_lr的内容可以知道程序运行到哪个位置出现fault

然后查看编译后汇编代码,可以知道源程序是哪个函数哪一步出现问题,

配合其它寄存器的内容来分析找出原因

  

  

2.用IAR的话,把startup_ewarm.c文件中的FaultISR()函数的内容改为:

volatile unsigned int stacked_r0;   

volatile unsigned int stacked_r1;   

volatile unsigned int stacked_r2;   

volatile unsigned int stacked_r3;   

volatile unsigned int stacked_r12;   

volatile unsigned int stacked_lr;   

volatile unsigned int stacked_pc;   

volatile unsigned int stacked_psr;   

  

//unsigned long cc;

  

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]\n");   

printf ("R0 = %x\n", stacked_r0);   

printf ("R1 = %x\n", stacked_r1);   

printf ("R2 = %x\n", stacked_r2);   

printf ("R3 = %x\n", stacked_r3);   

printf ("R12 = %x\n", stacked_r12);   

printf ("LR = %x\n", stacked_lr);   

printf ("PC = %x\n", stacked_pc);   

printf ("PSR = %x\n", stacked_psr);   

printf ("BFAR = %x\n", (*((volatile unsigned long *)(0xE000ED38))));   

printf ("CFSR = %x\n", (*((volatile unsigned long *)(0xE000ED28))));   

printf ("HFSR = %x\n", (*((volatile unsigned long *)(0xE000ED2C))));   

printf ("DFSR = %x\n", (*((volatile unsigned long *)(0xE000ED30))));   

printf ("AFSR = %x\n", (*((volatile unsigned long *)(0xE000ED3C))));   

  

   

  while(1)

  {

          ;;

  }

如果使用调试器,则可以在第一个printf处设置断点.没有的话看串口打印结果

通过查看stacked_lr的内容可以知道程序运行到哪个位置出现fault

然后查看编译后汇编代码,可以知道源程序是哪个函数哪一步出现问题,

配合其它寄存器的内容来分析找出原因
tuzihog 发表于 2014-11-2 21:05 | 显示全部楼层
别怪我挖坟
好东东,关注一下
dong_abc 发表于 2014-11-2 21:09 | 显示全部楼层
+1

评分

参与人数 1威望 +1 收起 理由
Just_Beat_It + 1 很给力!

查看全部评分

xlsbz 发表于 2014-11-6 13:12 | 显示全部楼层
富贵 有两把刷子  以前还小看你了
xlsf1048 发表于 2014-12-24 15:44 | 显示全部楼层
myqq12 发表于 2014-12-24 17:21 | 显示全部楼层
牛X+威武
冒泡的鱼儿 发表于 2014-12-30 21:32 | 显示全部楼层
多谢分享
tangqiiln 发表于 2015-1-30 20:12 | 显示全部楼层
liu100149 发表于 2015-3-8 11:16 | 显示全部楼层
我的根据stacked_lr=0x00004c29
C是这句 liuhuaqiang=SPI_SendByte(dat);
汇编代码
0x00004C28 4905      LDR      r1,[pc,#20]  ; @0x00004C40
0x00004C2A 7008      STRB     r0,[r1,#0x00]
是什么问题
nyszx 发表于 2015-3-8 13:57 | 显示全部楼层
很强大,有时间试一下。谢谢分享
wmslecz 发表于 2015-3-9 18:42 | 显示全部楼层
非常给力呀。。。好东西。赞一个。。。
firstfox 发表于 2016-11-4 09:41 | 显示全部楼层
如果能在实例讲解一下就更好了
yu0405jie 发表于 2016-11-4 16:35 | 显示全部楼层
getappple 发表于 2016-12-23 20:21 | 显示全部楼层
FUK****** 老朴
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:上联:subway railway highway,way way to die 下联:investigator officer announcer,sir sir to lie 横批:welcome to china

29

主题

1274

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部