之前文章说了原理,这里把最终实现的代码总结:

IAR

 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[]);
stacked_r1 = ((unsigned long) hardfault_args[]);
stacked_r2 = ((unsigned long) hardfault_args[]);
stacked_r3 = ((unsigned long) hardfault_args[]); stacked_r12 = ((unsigned long) hardfault_args[]);
stacked_lr = ((unsigned long) hardfault_args[]);
stacked_pc = ((unsigned long) hardfault_args[]);
stacked_psr = ((unsigned long) hardfault_args[]); printf ("\r\n[Hard fault handler - all numbers in hex]\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[R14]=%x subroutine call return address\r\n",stacked_lr);
printf ("PC[R15]=%x program counter\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))));
printf ("SCB_SHCSR=%x\r\n", SCB->SHCSR); while ();
}

hard_fault_handler_c

 void HardFault_Handler( void )
{
__ASM("TST LR, #4");
__ASM("ITE EQ");
__ASM("MRSEQ R0, MSP");
__ASM("MRSNE R0, PSP");
__ASM("B hard_fault_handler_c");
}

HardFault_Handler

这里的HardFault_Handler里是内联汇编

MDK不能使用内联汇编

 __ASM void HardFault_Handler(void)
{
TST lr, # // Test for MSP or PSP
ITE EQ
MRSEQ r0, MSP
MRSNE r0, PSP
IMPORT HardFault_Handler_C
B HardFault_Handler_C
}

HardFault_Handler

 void HardFault_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[]);
stacked_r1 = ((unsigned long) hardfault_args[]);
stacked_r2 = ((unsigned long) hardfault_args[]);
stacked_r3 = ((unsigned long) hardfault_args[]); stacked_r12 = ((unsigned long) hardfault_args[]);
stacked_lr = ((unsigned long) hardfault_args[]);
stacked_pc = ((unsigned long) hardfault_args[]);
stacked_psr = ((unsigned long) hardfault_args[]); printf ("\n\n[Hard fault handler - all numbers in hex]\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 [R14] = %x subroutine call return address\r\n", stacked_lr);
printf ("PC [R15] = %x program counter\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))));
printf ("SCB_SHCSR = %x\r\n", SCB->SHCSR); while ();
}

HardFault_Handler_C

 [Hard fault handler - all numbers in hex]
R0 =
R1 =
R2 =
R3 = c0
R12 =
LR [R14] = subroutine call return address
PC [R15] = program counter
PSR =
BFAR =
CFSR =
HFSR =
DFSR =
AFSR =
SCB_SHCSR =

对于调试很有帮助的,注意PC[R15]的数值是我们需要的

HardFault_Handler 输出日志信息的更多相关文章

  1. Myeclipse集成Jboss 6.1控制台不输出日志信息

    在使用myeclipse+jboss 6.1开发的时候发现jboss能够正常启动但是myeclipse的控制台却没有任何的信息输出,这使得我没有办法开发,在查找了大部分的资料发现很多说要改什么jbos ...

  2. Android开发3——查看和输出日志信息

    一.错误级别 Error > Warn > Info > Debug > Verbose(冗余) 二.Android项目日志查看视图 Console视图只能看项目的部署到模拟器 ...

  3. 如何正确地在SOE中输出日志信息

    ArcGIS for Server提供完善的日志管理机制,用于日志的记录.查询和自动清除.开发人员在开发编写SOE代码时,应该采用该机制进行日志记录的输出.如果不采用该机制,输出的日志消息会写到Arc ...

  4. nohup不输出日志信息的方法,及linux重定向学习

    起因 最近使用nohup创建了一个后台进程,默认日志输出到了nohup.out文件中,程序跑起来也就没再管,过了大约一周,发现硬盘空间不够了,于是查找原因,发现这个nohup.out文件已经到了70G ...

  5. nohup不输出日志信息的方法及linux重定向

    最近使用nohup创建了一个后台进程,默认日志输出到了nohup.out文件中,程序跑起来也就没再管,过了大约一周,发现硬盘空间不够了,于是查找原因,发现这个nohup.out文件已经到了70G了,导 ...

  6. tomcat的日志不输出日志信息的解决方法

    1.下载日志jar包,例如:commons-logging-1.1.1.jar.放在tomcat的bin目录下,或者是自己项目的lib包里. 2.修改tomcat的bin目录下面的catalina.b ...

  7. Android学习笔记Log类输出日志信息

    Log类提供的方法 代码示例 .. Log.e(TAG,"[错误信息]"); Log.w(TAG,"[警告信息]"); Log.i(TAG,"[普通信 ...

  8. 解决spark-shell输出日志信息过多

    import org.apache.log4j.Logger import org.apache.log4j.Level Logger.getLogger("org").setLe ...

  9. shell脚本实现定时重启任务并输出日志信息

    #!/bin/bash #当前日期 time=`date` pidno=`ps aux|grep adserver-beta|grep -v "grep"|awk '{print ...

随机推荐

  1. 【Dijstra堆优化】HDU 3986 Harry Potter and the Final Battle

    http://acm.hdu.edu.cn/showproblem.php?pid=3986 [题意] 给定一个有重边的无向图,T=20,n<=1000,m<=5000 删去一条边,使得1 ...

  2. poj 3155 二分+最小割求实型最小割(最大密集子图)

    /* 最大密集子图子图裸题 解法:设源点s和汇点t 根据胡波涛的<最小割模型在信息学中的应用> s-每个点,权值为原边权和m, 每个点-t,权值为m+2*g-degree[i], 原来的边 ...

  3. type和metaclass元类

    元类type 1. 创建类的两种方式 (都是由type元类创建) 方式一: class Foo(object): # 默认metaclass = type, 当前类, 由type类创建 a = 'aa ...

  4. T1365 浴火银河星际跳跃 codevs

    http://codevs.cn/problem/1365/  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 小 K 又在玩浴 ...

  5. java数据结构和算法09(哈希表)

    树的结构说得差不多了,现在我们来说说一种数据结构叫做哈希表(hash table),哈希表有是干什么用的呢?我们知道树的操作的时间复杂度通常为O(logN),那有没有更快的数据结构?当然有,那就是哈希 ...

  6. jquery 关于ajax 及其son

    <%@ page language="java" pageEncoding="UTF-8"%><%@include file="/c ...

  7. linux中的线程局部存储(TLS)

    http://blog.csdn.net/cywosp/article/details/26469435

  8. topcoder srm 610

    div1 250pt: 题意:100*100的01矩阵,找出来面积最大的“类似国际象棋棋盘”的子矩阵. 解法:枚举矩阵宽(水平方向)的起点和终点,然后利用尺取法来找到每个固定宽度下的最大矩阵,不断更新 ...

  9. Deepin-安装php

    点击即可:下载:PHP5.6 下载完后执行下面这条shell命令即可完成安装 文件保存为:php_install.sh ,运行时:sh php_install.sh .tar.bz2 cd php- ...

  10. AFNetworking配合Swift3.0请求数据

    首先用桥接或pods将AFNetworking导入项目,在这不再赘述,然后创建一个单例NetWorkTools.swift 继承:AFHTTPSessionManager import UIKit i ...