基于Geehy G32 R501 故障定位方法
本帖最后由 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下载CmBacktrace 后,需要对两个文件进行一些基础配置,以确保它能正常工作。第一步:这里我们把cm_backtrace文件拷贝到自己项目工程中,本案例是在uart_ex2_interruptz_test文件夹内。打开工程,把如下文件加入工程中,包括.c和.h文件,操作方法如下2.配置完后,我们对主函数中内容进行修改,并增加如下内容,详见附件。初始化cm_backtrace_init()这里我们测试4个故障方法已验证故障定位1,非对齐故障 fault_test_by_unalign();2,除法除0fault_test_by_div0();3,数组越界 fault_test_by_shuzu();4,指针越界 fault_test_by_zhizhen(); 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$$Limitcmb_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 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 经过以上配置,我们可以测试验证是否可以正确定位了,打开串口工具,程序全速运行后,程序跑飞,串口打印出详细错误类型,具体是哪行程序导致跑飞还需要下一步操作 第二步:设置环境变量把tools文件夹中的addr2line.exe(64和32为电脑位数)拷贝到包含CmBacktrace.axf的文件中,用户根据自己程序位置设置。 注意:在该文件下,按住shift键,同时点击鼠标右键,通过“在终端中打开” 在串口工具中拷贝打印内容:“addr2line -e CmBacktrace.axf -afpiC 00000004 0800359e 080035c8 0800de 08000808”,粘贴至终端窗口如下并按下回撤键,可快速定位故障位置。 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
页:
[1]