#技术资源#利用cm_backTrace快速定位AC78xx的hardfault
在软件调试的过程中,经常会遇到出现hardfault的情况,出现hardfault,可能很难找出问题的原因。小编无意间发现了一个好东东,可以快速定位到hardfault的位置,在这里分享给大家,让大家调试跟轻松。
这个好东西就是cm_backTrace, cm_backTrace是开源软件,只要把cm_backTrace移植到AC781x/AC7801x上,在出现hardfault的时候,cm_backTrace就可以打印出当前出错信息,把这这信息输入到一个工具内(cm_backTrace提供的工具),就可以找到出现hradfault的位置。
cm_backTrace工具开源链接在:https://github.com/armink/CmBacktrace
当前最新版本(2021.3.8)的cm_backTrace可在这里下载:
CmBacktrace-master.zip
(4.92 MB)
接下来演示一下如何使用cm_backTrace.
1. 下载cm_backTrace源码。
2. 将下载源码的cm_backtrace文件夹放在要检查hardfault的工程内。
3. 将cm_backtrace文件夹下的源码添加至工程内,并设置相应的文件路径。
4. 重定向hardFault_Hander 中断服务函数,keil下添加.\cm_backtrace\fault_handler\keil\cmb_fault.S。(gcc或iar可添加对应文件夹下重定向文件)
5. 包含cm_backTrace头文件(#include "cm_backtrace.h"),初始化cm_backTrace(cm_backtrace_init("CM_BackTrace demo", "HW_V1.0", "SW_V1.0");).
6. 配置cm_backTrace(cmb_cfg.h).
7. 制造hardfault.
fault_test.c内提供了两个制造hardfault的函数。在这里调用fault_test_by_unalign() 制造hardfault.
运行代码,可在串口下看到:
把堆栈信息copy出来,把CM_BackTrace demo.axf替换成我们的axf文件,运行addr2line.exe,即可找出hardfault的位置。
8.运行addr2line.exe。(演示64bit win10系统操作过程)
8.1. copy addr2line.exe工具到工程生成文件夹内,工具路径在.\CmBacktrace-master\tools\addr2line\win64内。
8.2 按住Win+R键,输出cmd, 回车进入控制台。
8.3 输入工程路径所在的盘符,如<F:>,按下回车。
8.4 cd命令打开工程输出axf 文件路径。addr2lin工具组要在此路径下运行。
8.5 在串口工具最后一行输出的堆栈信息,addr2line -e CM_BackTrace demo.axf -a -f 08002612 0800198c 0800013c 080029fc 中,将CM_BackTrace demo.axf替换成我们的axf文件,即addr2line -e cm_backTrace.axf -a -f 08002612 0800198c 0800013c 080029fc
输入到控制台。
我们看一下该行代码:
从代码上看,是因为访问了非对齐的空间,造成了hardfault.
从上述的例子中可以看出,利用cm_backTrace, 很容易定位到hardfault所在的位置,再分析一下,即可找出出错原因。
测试工程上传到这里,方便大家学习。
AC781X_BackTrace.rar
(1.87 MB)
|
好帖子,干货