打印

定位cortex-m3的hard fault的方法

[复制链接]
6610|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 | 只看该作者
富贵 有两把刷子  以前还小看你了

使用特权

评论回复
5
xlsf1048| | 2014-12-24 15:44 | 只看该作者
mark

使用特权

评论回复
6
myqq12| | 2014-12-24 17:21 | 只看该作者
牛X+威武

使用特权

评论回复
7
冒泡的鱼儿| | 2014-12-30 21:32 | 只看该作者
多谢分享

使用特权

评论回复
8
tangqiiln| | 2015-1-30 20:12 | 只看该作者
mark~~

使用特权

评论回复
9
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]
是什么问题

使用特权

评论回复
10
nyszx| | 2015-3-8 13:57 | 只看该作者
很强大,有时间试一下。谢谢分享

使用特权

评论回复
11
wmslecz| | 2015-3-9 18:42 | 只看该作者
非常给力呀。。。好东西。赞一个。。。

使用特权

评论回复
12
firstfox| | 2016-11-4 09:41 | 只看该作者
如果能在实例讲解一下就更好了

使用特权

评论回复
13
yu0405jie| | 2016-11-4 16:35 | 只看该作者
mark

使用特权

评论回复
14
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

粉丝