I.MX RT1176笔记(9)-- 程序异常追踪(CmBacktrace 和 segger rtt)

news2024/9/25 10:40:32

前言

在使用 ARM Cortex-M 系列 MCU时候,有时候会遇到各种异常(Hard Fault, Memory Management Fault, Bus Fault, Usage Fault, Debug Fault),这时候我们根据经验查询PC指针,LR寄存器,堆栈数据定位地址然后再通过反汇编确定异常位置,但往往会花很多时间,那么有没有一种工具可以很快定位出错位置呢?这里推荐使用 CmBacktrace

开发前期准备

  • 硬件平台 rt1176开发板
  • IDE: GNU(vscode)
  • CmBacktrace + segger rtt
1.Segger RTT 获取

J-Link RTT – Real Time Transfer (segger.com)

segger rtt 可以简单理解 Jlink的组件吧,我们不需要多余外设(如串口等),只需要调试口,将需要的数据打印到窗口。组件获取很简单,如果安装了Jlink驱动,直接到安装路径会找到组件压缩文件,将文件解压到工程就行了。

请添加图片描述

2.CmBacktrace 获取

CmBacktrace: ARM Cortex-M 系列 MCU 错误追踪库 (gitee.com)

GitHub - armink/CmBacktrace: Advanced fault backtrace library for ARM Cortex-M series MCU | ARM Cortex-M 系列 MCU 错误追踪库

3.移植 CmBacktrace 和 Segger RTT
  • cmake中添加相关文件和路径

请添加图片描述

请添加图片描述

请添加图片描述

  • 修改 cmb_cfg.h

用户需要自行手动配置,常用配置如下:

配置名称功能备注
cmb_println(…)错误及诊断信息输出必须配置
CMB_USING_BARE_METAL_PLATFORM是否使用在裸机平台使用则定义该宏
CMB_USING_OS_PLATFORM是否使用在操作系统平台操作系统与裸机必须二选一
CMB_OS_PLATFORM_TYPE操作系统平台RTT/UCOSII/UCOSIII/FREERTOS
CMB_CPU_PLATFORM_TYPECPU平台M0/M3/M4/M7
CMB_USING_DUMP_STACK_INFO是否使用 Dump 堆栈的功能使用则定义该宏
CMB_PRINT_LANGUAGE输出信息时的语言CHINESE/ENGLISH
#ifndef _CMB_CFG_H_
#define _CMB_CFG_H_

#include "SEGGER_RTT.h"


/* print line, must config by user */
#define cmb_println(...)               SEGGER_RTT_printf(0, __VA_ARGS__);SEGGER_RTT_WriteString(0, "\r\n")
/* enable bare metal(no OS) platform */
/* #define CMB_USING_BARE_METAL_PLATFORM */
/* enable OS platform */
#define CMB_USING_OS_PLATFORM
/* OS platform type, must config when CMB_USING_OS_PLATFORM is enable */
#define CMB_OS_PLATFORM_TYPE  CMB_OS_PLATFORM_FREERTOS   // CMB_OS_PLATFORM_RTT or CMB_OS_PLATFORM_UCOSII or CMB_OS_PLATFORM_UCOSIII or CMB_OS_PLATFORM_FREERTOS or CMB_OS_PLATFORM_RTX5 */
/* cpu platform type, must config by user */
#define CMB_CPU_PLATFORM_TYPE    CMB_CPU_ARM_CORTEX_M7      /* CMB_CPU_ARM_CORTEX_M0 or CMB_CPU_ARM_CORTEX_M3 or CMB_CPU_ARM_CORTEX_M4 or CMB_CPU_ARM_CORTEX_M7 */
/* enable dump stack information */
#define CMB_USING_DUMP_STACK_INFO /**/
/* language of print information */
#define CMB_PRINT_LANGUAGE   CMB_PRINT_LANGUAGE_ENGLISH        /*  CMB_PRINT_LANGUAGE_ENGLISH(default) or CMB_PRINT_LANGUAGE_CHINESE */
#endif /* _CMB_CFG_H_ */

  • 修改 cmb_def.h ,根据链接脚本添加栈顶地址栈截至地址代码段起始地址,截止地址

请添加图片描述

  • 修改 cm_backtrace.c 使用C99gnu99

笔者工程默认用的gnu99标准,所以屏蔽了如下信息(如果是C99可保留)

请添加图片描述

  • 修改 HardFault_Handler MemManage_Handler 中断函数(笔者没添加cm_fault.S
void HardFault_Handler(void)
{
  __asm volatile
  (
    "	mov r0, lr							\n"
    "	mov r1, sp							\n"
    "	bl cm_backtrace_fault		\n"
  );

  while(1);
}

void MemManage_Handler(void)
{
  __asm volatile
  (
    "	mov r0, lr							\n"
    "	mov r1, sp							\n"
    "	bl cm_backtrace_fault		\n"
  );

  while(1);
}
  • FreeRtos修改内容(没有使用不用关心)

task.c 末尾添加

/*-----------------------------------------------------------*/
/*< Support For CmBacktrace >*/
uint32_t * vTaskStackAddr()
{
    return pxCurrentTCB->pxStack;
}
 
uint32_t vTaskStackSize()
{
    #if ( portSTACK_GROWTH > 0 )
    
    return (pxNewTCB->pxEndOfStack - pxNewTCB->pxStack + 1);
    
    #else /* ( portSTACK_GROWTH > 0 )*/
    
    return pxCurrentTCB->uxSizeOfStack;
    
    #endif /* ( portSTACK_GROWTH > 0 )*/
}
 
char * vTaskName()
{
    return pxCurrentTCB->pcTaskName;
}
/*-----------------------------------------------------------*/

typedef struct tskTaskControlBlock添加

#if( portSTACK_GROWTH <= 0)
	UBaseType_t     uxSizeOfStack;      /*< Support For CmBacktrace >*/
#endif

static void prvInitialiseNewTask添加

pxNewTCB->uxSizeOfStack = ulStackDepth;   /*< Support For CmBacktrace >*/

请添加图片描述

4.写一个能进异常中断的代码
uint32_t *ptr32=0xFFFFFFF1;
uint32_t tmp;

//笔者放到一个线程中
static void xAPP_KeyScanTask(void* pvParameters)
{
	while(1)
	{
		/*按键扫描*/
		xSYS_LEDKEY_KeyScan();
#if CONFIG_EN_CMBACKTRACE
        tmp = *ptr32; //这句话放到任一地方,将会引起异常
#endif        
        vTaskDelay(10);
    }
}
5.添加 CmBacktrace 和 Segger RTT 初始化代码
	SEGGER_RTT_Init();
    cm_backtrace_init("rt1176_rtos_app", "B1.0.0", "B1.0.0");
	SEGGER_RTT_printf(0, "Enable Cmbacktrace\r\n");
6.运行代码,查询异常信息

打开 J-Link RTT Viewer将监听到异常打印信息,甚至知道错误代码在函数:xAPP_KeyScanTask 中,除此之外我们可以通过终端控制台,输入如下命令(addr2line.exeCmBacktrace 提供工具):

.\addr2line.exe -e .\rt1176_rtos_app.elf -a -f 00001fc0 00003c26

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/985631.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解联邦学习——纵向联邦学习

分类目录&#xff1a;《深入理解联邦学习》总目录 假设进行联邦学习的数据提供方为 A A A和 B B B&#xff0c;第三方为 C C C&#xff0c;则纵向联邦学习步骤如下&#xff1a; 在系统级做加密样本对齐&#xff0c;在企业感知层面不会暴露非交叉用户对齐样本进行模型加密训练&…

day2_C++

day2_C 代码题思维导图 代码题 #include using namespace std;#define MAX 50struct StuData {private:int scoreArr[MAX];int num;public:void setNum(int num);void input();void sort();void show();int getnum();};void StuData::setNum(int num){this->num num; }vo…

c语言实训心得3篇集合

c语言实训心得体会一&#xff1a; 在这个星期里&#xff0c;我们专业的学生在专业老师的带领下进行了c语言程序实践学习。在这之前&#xff0c;我们已经对c语言这门课程学习了一个学期&#xff0c;对其有了一定的了解&#xff0c;但是也仅仅是停留在了解的范围&#xff0c;对里…

[杂谈]-快速了解直接内存访问 (DMA)

快速了解直接内存访问 (DMA) 文章目录 快速了解直接内存访问 (DMA)1、使用 DMA 需要什么&#xff1f;2、DMA介绍3、DMA 中的数据传输如何进行&#xff1f;4、DMA接口5、DMAC 控制器寄存器6、DMA 控制器编程模式6.1 突发模式&#xff08;Burst Mode&#xff09;6.2 循环窃取模式…

h5微传单制作教程:快速轻松制作

在当今社交媒体充斥的时代&#xff0c;微传单作为一种新型的宣传推广方式&#xff0c;成为了企业和个人在传播信息时的重要工具。h5微传单相比传统的纸质传单更加灵活多样&#xff0c;并且能够通过手机、平板等设备随时随地进行浏览和分享&#xff0c;具有很高的传播效果。下面…

20个经典巧妙电路合集

1、防反接保护&#xff08;二极管&#xff09; 在实际电子设计中&#xff0c;防反接保护电路非常重要&#xff0c;不要觉得自己肯定不会接错&#xff0c;实际上无论多么小心&#xff0c;还是会犯错误...... 最简单的就是利用二极管了&#xff0c;利用二极管的单向导电性&#…

荔枝集团:如何提升项目管理效能,让需求交付快进50%

导语&#xff1a; 随着市场竞争日益激烈&#xff0c;企业面临的压力越来越大&#xff0c;需要不断优化自身的效率和质量&#xff0c;以更好地应对市场变化和竞争压力。因此&#xff0c;效能改进已成为企业实现长期发展的关键要素。 研发浓度作为一种能够准确反映研发效率的指…

ubuntu上ffmpeg使用framebuffer显示video

这个主题是想验证使用fbdev(Linux framebuffer device&#xff09;&#xff0c;将video直接显示到Linux framebuffer上&#xff0c;在FFmpeg中对应的FFOutputFormat 就是ff_fbdev_muxer。 const FFOutputFormat ff_fbdev_muxer {.p.name "fbdev",.p.long_…

大数据技术之Hadoop:HDFS存储原理篇(五)

目录 一、原理介绍 1.1 Block块 1.2 副本机制 二、fsck命令 2.1 设置默认副本数量 2.2 临时设置文件副本大小 2.3 fsck命令检查文件的副本数 2.4 block块大小的配置 三、NameNode元数据 3.1 NameNode作用 3.2 edits文件 3.3 FSImage文件 3.4 元素据合并控制参数 …

你知道聊天机器人在医疗保健行业发挥了什么作用吗?

在医疗保健行业&#xff0c;时间限制、数据泄露、误诊、治疗延误和人为错误等各种挑战构成了重大问题。然而&#xff0c;人工智能&#xff08;AI&#xff09;的快速发展已成为解决这些问题的解决方案。一个特别值得注意的应用是医疗保健中的聊天机器人&#xff0c;它提供了一系…

Linux---应用层获取usb设备描述信息通过endpoint地址数据通讯

文章目录 &#x1f308;应用层获取USB设备信息总体思路&#x1f308;应用层代码实例&#x1f308;实例测试&#x1f308;应用层通过endpoint进行数据读写 &#x1f308;应用层获取USB设备信息总体思路 应用层可以打开USB设备的节点&#xff0c;读取包括USB设备的配置&#xff…

核心实验12合集_vlan高级配置:基于子网划分vlan超级vlan相同vlan 端口隔离 _ENSP

项目场景一&#xff1a; 核心实验12合集-1_vlan高级配置_ENSP 基于子网划分vlan &#xff11; 当检测ip在192.168.10.0/24时候&#xff0c;PC接入交换机时&#xff0c;将其划为vlan10&#xff0c; 且可以和vlan 10 的服务器通信。 2 当检测ip在192.168.20.0/24时候&#xff0c;…

配电室数字电力智慧平台

配电室数字电力智慧平台依托电易云-智慧电力物联网&#xff0c;采用先进的人工智能、物联网、大数据技术&#xff0c;对配电室进行全面监控和管理&#xff0c;实现电力运行的自动化和智能化&#xff0c;有效降低运维成本&#xff0c;提高电力运行安全和可靠性。 该平台可以实时…

CTFHUB ICS(2)

1.modbus 还是通过strings输出文件 发现这次只找到了flag的字符666c61677b就是flag的16进制 通过strings和grep配合输出为10个数量的数据 strings 6.pcap | grep -E "^.{10}$" grep 搜索文本的工具 -E 使用扩展正则表达式 ^ 表示行的开始 . 匹配任意单…

内网渗透之凭据收集的各种方式

凭据收集是什么&#xff1f; 凭据收集是获取用户和系统凭据访问权限的术语。 这是一种查找或窃取存储的凭据的技术&#xff0c;包括网络嗅探&#xff0c;攻击者可以在网络嗅探中捕获传输的凭据。 凭证可以有多种不同的形式&#xff0c;例如&#xff1a; 帐户详细信息&#xf…

用上这个建筑管理技巧,我才知道有多省事!

在过去的几十年里&#xff0c;建筑和施工行业取得了巨大的进步。然而&#xff0c;这个行业也一直在不断面临挑战&#xff0c;如高成本、时间压力、安全隐患和资源浪费。 随着科技的飞速发展&#xff0c;我们进入了一个新的时代&#xff0c;一个改变着建筑和施工方式的时代 - 智…

TSINGSEE青犀视频AI分析/边缘计算/AI算法·安全帽检测功能——多场景高效运用

安全帽检测算法主要是对人员安全和事故预防的需要。在许多工业领域和施工现场&#xff0c;佩戴安全帽是一种重要的安全措施&#xff0c;可以减少头部受伤的风险。然而&#xff0c;由于工地人员数量众多且繁忙&#xff0c;人工监控难以有效覆盖所有区域&#xff0c;因此旭帆科技…

vue-别名路径联想提示的配置

在根路径下&#xff0c;新建 jsconfig.json 文件&#xff0c;即可 在输入 自动联想到src目录。 代码如下&#xff1a; // 别名路径联想提示&#xff1a;输入自动联想 {"compilerOptions":{"baseUrl":"./","paths": {"/*":[…

算法训练day43|动态规划 part05:0-1背包 (LeetCode 1049. 最后一块石头的重量 II、494. 目标和、474.一和零)

文章目录 1049. 最后一块石头的重量 II思路分析代码实现 494. 目标和思路分析动规方法代码实现总结思考 474.一和零思路分析代码实现思考总结 var code "57a5e730-4e5e-43ad-b567-720d69f0371a"1049. 最后一块石头的重量 II 题目链接&#x1f525;&#x1f525; 有…

泽众TestOne自动化测试平台,挡板测试(Mock测试)上线了!!

什么是挡板测试&#xff08;Mock测试&#xff09;&#xff1f; 主要应对与某些不容易构造或者不容易获取的对象以及暂时没有开发完成的对象&#xff0c;设计一个虚拟的对象&#xff0c;配置测试需求的业务数据&#xff0c;完成测试业务。 TestOne是泽众软件自主研发的一体化测…