什么是CmBacktrace-在RT-Thread中使用CmBacktrace的例子.doc
《什么是CmBacktrace-在RT-Thread中使用CmBacktrace的例子.doc》由会员分享,可在线阅读,更多相关《什么是CmBacktrace-在RT-Thread中使用CmBacktrace的例子.doc(7页珍藏版)》请在三一文库上搜索。
1、什么是CmBacktrace?在RT-Thread中使用CmBacktrace的例子对于从C51 、MSP430 等简单单片机转而使用更加复杂的 ARM 新人来说,时不时出现的hard falut死机会让新人瞬间懵掉。定位错误的方法也往往是连接上仿真器,一步步 F10/F11单步,定位到具体的错误代码,再去猜测、排除、推敲错误原因,这种过程十分痛苦,且花费的时间很长。当然,也有部分开发者通过故障寄存器信息来定位故障原因及故障代码地址,虽然这样能解决一小部分问题,但是重复的、繁琐的分析过程也会耽误很多时间。而且对于一些复杂问题,只依靠代码地址是无法解决的,必须得还原错误现场的函数调用逻辑关系。虽
2、然连接仿真器可以查看到的函数调用栈,但故障状态下是无法显示的,所以还是得一步步F10/F11单步去定位错误代码的位置。另外,很多产品真机调试时必须断开仿真器,这又使定位错误代码雪上加霜。为了能让开发者更快的知道造成hard falut 的原因,更快的定位到错误代码的位置,本应用笔记将一步步介绍CmBacktrace 的相关知识和使用方法,让开发者能不费吹灰之力就找出代码中的问题所在。本文的结构本文首先介绍了什么是 CmBacktrace,然后介绍了使用 CmBacktrace 要做的准备工作,接着介绍了在RT-Thread中使用CmBacktrace的例子,最后总结了使用 CmBacktrac
3、e 时的常见问题。通过这些讲解,希望开发者能更快上手 CmBacktrace。CmBacktrace 是什么CmBacktrace(Cortex Microcontroller Backtrace)是一款针对 ARM Cortex-M 系列 MCU 的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下:支持的错误包括:断言(assert)故障(Hard Fault, Memory Management Fault, Bus Fault, Usage Fault, Debug Fault)故障原因自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析
4、繁杂的故障寄存器;输出错误现场的函数调用栈(需配合 addr2line 工具进行精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、精准。也可以在正常状态下使用该库,获取当前的函数调用栈;支持 裸机 及以下操作系统平台:RT-ThreadUCOSFreeRTOS(需修改源码)根据错误现场状态,输出对应的 线程栈 或 C 主栈;故障诊断信息支持多国语言(目前:简体中文、英文);适配 Cortex-M0/M3/M4/M7 MCU;支持 IAR、KEIL、GCC 编译器;准备工作准备 addr2line在 https:/github/armink/CmBacktrace/tree/
5、master/tools/addr2line 页面中下载 addr2line(需要按照自己的系统版本下载),然后将下载下来的addr2line 拷贝至C:Windows下 ,这样就可以使用 addr2line 了。ENV配置RT-Thread 已经对 CmBacktrace 做了适配,直接在 ENV 使能 CmBacktrace 就可以使用了。下面介绍如何在 ENV 中配置CmBacktrace:打开 ENV,进入相应的 bsp 目录输入 menuconfig进入 RT-Thread online packages - tools packages使能 CmBacktrace进入 CmBack
6、trace 配置界面选择自己的 CPU 平台选择打印的语言选择版本,推荐使用最新版确认宏定义CmBacktrace 的运行需要知道存放代码的 SECTION 的开始地址和结束地址以及栈的 SECTION 的开始地址和结束地址。用户只需要查看 cmb_def.h 文件里默认定义的 CMB_CSTACK_BLOCK_NAME 和 CMB_CODE_SECTION_NAME 这两个宏是否正确即可。如不正确,用户需要根据分散加载文件和启动文件来确定这两个宏的值并在 cmb_cfg.h 里重新定义这两个宏。这里以 rt1052 的 mdk 工程为例进行讲解如何在工程里找到这两个宏的值。首先找 CMB_C
7、STACK_BLOCK_NAME 的值,我们打开工程里的启动文件,可以在文件的开头看到这样一段代码AREA RESET, DATA, READONLY EXPORT _Vectors EXPORT _Vectors_End EXPORT _Vectors_Size IMPORT |Image$ARM_LIB_STACK$ZI$Limit| _Vectors DCD |Image$ARM_LIB_STACK$ZI$Limit| ; Top of StackImage$ARM_LIB_STACK$ZI$Limit 就是我们要找的内容了,因为代码里会自动拼接上最后的 $Limit,所以 CMB_CS
8、TACK_BLOCK_NAME 的值应该是 Image$ARM_LIB_STACK$ZI。CMB_CODE_SECTION_NAME 的值在分散加载文件里寻找,分散加载文件可以点击 MDK的 Options - Linker 选项面板里的 Edit. 按纽打开我们可以找到这样一段代码ER_IROM1 m_text_start m_text_size ; load address = execution address * (RESET,+FIRST) * (InRoot$Sections) .ANY (+RO) 保存有 .ANY (+RO) 的 SECTION 名字就是我们要找的值,所以,CM
9、B_CODE_SECTION_NAME 的值为 ER_IROM1。开启C99C+mBacktrace 的使用需要 C99 的支持,使用 MDK 的开发者可以在 Options - C/C+面板中勾选 C99 Mode选项。使用IAR的开发者,可以在 Options - C/C+ Compiler 中选择 C99。使用 GCC 进行编译的用户,在编译配置中增加-std=c99即可 。确定初始化参数在使用 CmBacktrace 之前需要先调用下初始化函数,函数原型如下:void cm_backtrace_init(const char *firmware_name, const char *ha
10、rdware_ver, const char *software_ver)CmBacktrace 的初始化函数需要 3 个参数,第一个参数是固件名字,第二个参数是硬件版本,第三个参数是软件版本。这三个参数会在发生 hard fault时打印出来,firmware_name需要填写生成的固件名称,错误填写会导致在使用 addr2line 时无法找到文件。hardware_ver和software_ver建议填写真实的软硬件版本号,方便后期调试和维护。在 cmb_port.c 文件中,我们可以看到 RT-Thread 已经将 rt_cm_backtrace_init 函数进行了自动初始化,默认的三
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 什么是 CmBacktrace RT Thread 使用 例子
链接地址:https://www.31doc.com/p-3373697.html