[G32R] 基于Geehy G32 R501 故障定位方法

[复制链接]
 楼主| duanchengjie325 发表于 2025-5-22 14:56 | 显示全部楼层 |阅读模式
本帖最后由 duanchengjie325 于 2025-5-22 14:56 编辑

#技术资源# #申请原创#



大家在用R501调试的时候有没有遇到过HardFault的问题呢:
下面针对这个问题分享一下小经验。
现象还原:在debug模式下进行仿真调试,全速运行再停止运行,程序会跑到 HardFault_Handler函数中,产生 HardFault其产生的原因大概有如下几类:
(1)数组越界操作;
(2)内存溢出,访问越界;
(3)堆栈溢出,程序跑飞;
(4)中断处理错误;
这里我们分享一款开源的工具:CmBacktrace ,可以快速直观HardFault错误定位的方法。
CmBacktrace 是一个高效的回溯工具,专用于在程序运行期间捕获和分析错误信息。它可以帮助开发者快速定位问题,特别是在复杂或大型应用中。本文将详细介绍 CmBacktrace 的安装、配置及使用方法。
适配 Cortex-M0/M3/M4/M7 MCU(R501为M52内核特殊处理);
支持 IAR、KEIL、GCC 编译器;
由于要通过串口把信息打印出来,我们直接在R501 SDK中G32R5xx_SDK_V1.0.0\driverlib\g32r501\examples\eval\uart\uart_ex2_interrupts移植作为测试对象。
总体过程分两步:
一.程序移植 二.设置环境变量
1. 下载 CmBacktrace
开源库地址:https://github.com/armink/CmBacktrace
21836682ec83d898b6.png
下载CmBacktrace 后,需要对两个文件进行一些基础配置,以确保它能正常工作。
第一步:
这里我们把cm_backtrace文件拷贝到自己项目工程中,本案例是在uart_ex2_interruptz_test文件夹内。
6436682ec85202650.png
打开工程,把如下文件加入工程中,包括.c和.h文件,操作方法如下
23963682ec859e2eb6.png
12109682ec86286788.png
2.配置完后,我们对主函数中内容进行修改,并增加如下内容,详见附件。
初始化cm_backtrace_init()
这里我们测试4个故障方法已验证故障定位
1,非对齐故障 fault_test_by_unalign();
2,除法除0  fault_test_by_div0();
3,数组越界 fault_test_by_shuzu();
4,指针越界 fault_test_by_zhizhen();
6281682ec86c46e8d.png
3.编译后出现较多错误,这时候我们还需要更改部分程序
cmb_fault.S的作用是在出现HardFault时,把指针跳转到特定位置,由于cmb_fault.S涉及到汇编,在编译过程中会出现多条指令不识别的问题,此时我们把该文件屏蔽掉即可,把startup_g32r501.c中HardFault_Handler内容改为如下:
void HardFault_Handler(void)
{
__asm("MOV     r0, lr\n"
    "MOV     r1, sp\n"
    "BL      cm_backtrace_fault\n");
}
这里也会报错,经查询RAM指导手册,如下需对应修改
在cm_backtrace.c中
    #define SECTION_START(_name_)                _name_##$$Base
    #define SECTION_END(_name_)                  _name_##$$Limit
改为:
    #define SECTION_START(_name_)                Image$$##_name_##$$Base
#define SECTION_END(_name_)                  Image$$##_name_##$$ZI$$Limit
77712682ec88fe9d19.png
cmb_cfg.h中:
释放printf,目的是通过串口打印出故障数据
#define cmb_println(...) printf(__VA_ARGS__);printf("\r\n")
释放无操作系统
#define CMB_USING_BARE_METAL_PLATFORM //无操作系统
释放芯片内核信息,由于R501采用的是M52内核,该例程暂不支持,我们改为5即可
#define CMB_CPU_PLATFORM_TYPE 5
释放堆载信息
#define CMB_USING_DUMP_STACK_INFO //堆载信息
释放采用中文打印
#define CMB_PRINT_LANGUAGE            CMB_PRINT_LANGUAGE_CHINESE
17066682ec899a9489.png
cmb_def.h
改为:
#if defined(__ARMCC_VERSION)
    /* C stack block name, default is STACK */
    #ifndef CMB_CSTACK_BLOCK_NAME
    #define CMB_CSTACK_BLOCK_NAME          ARM_LIB_STACK
    #endif
    /* code section name, default is ER_IROM1 */
    #ifndef CMB_CODE_SECTION_NAME
#define CMB_CODE_SECTION_NAME          ER_ROM
41943682ec8b77bc83.png
经过以上配置,我们可以测试验证是否可以正确定位了,打开串口工具,程序全速运行后,程序跑飞,串口打印出详细错误类型,具体是哪行程序导致跑飞还需要下一步操作
28104682ec8fa34af7.png
第二步:
设置环境变量
把tools文件夹中的addr2line.exe(64和32为电脑位数)拷贝到包含CmBacktrace.axf的文件中,用户根据自己程序位置设置。
1104682ec907df774.png
注意:在该文件下,按住shift键,同时点击鼠标右键,通过“在终端中打开”
73389682ec911ec87d.png
在串口工具中拷贝打印内容:“addr2line -e CmBacktrace.axf -afpiC 00000004 0800359e 080035c8 0800de 08000808”,粘贴至终端窗口如下并按下回撤键,可快速定位故障位置。
55818682ec91dac96f.png
2045682ec921b0fce.png
4. 常见问题
4.1 回溯信息不完整
如果您发现捕获的回溯信息不完整,可能是因为没有正确配置符号信息。确保在编译时添加了调试信息选项,例如 `-g`。
4.2 无法找到库
如果在运行程序时出现找不到库的错误,请确保环境变量 `LD_LIBRARY_PATH` 设置正确,并包含了 CmBacktrace 的安装路径。
4.3 兼容性问题
CmBacktrace 在不同的操作系统和编译器上都有良好的兼容性,但某些特定的功能可能在特定环境下存在限制。请查阅官方文档以获取更多信息。
5. 总结
CmBacktrace 是一个强大的工具,可以帮助开发者在程序中捕获和分析错误信息。通过合理的配置和使用,您可以提高调试效率,快速定位问题。希望本文的教程能够帮助您顺利使用 CmBacktrace,提高开发效率。如有进一步问题,建议查阅官方文档或参与社区讨论。

参考资料:
http://www.openedv.com/thread-303755-1-1.html


2508682ec88bd2222.png

uart_ex2_interrupts_test.zip

836.39 KB, 下载次数: 0

您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

5

帖子

0

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