CmBacktrace 相当于重写了hard_fault函数,在hard_fault函数里面去分析SCB寄存器的信息和堆栈信息,然后把这些信息打印出来(或者写到flash);通过使用串口输出产生hard_fault的堆栈信息,然后利用addr2line工具反推出具体的代码执行函数,快速定位hard_fault问题;

1:CmBacktrace获取

看两个git的更新记录,github应该是比较新的;作者都是同一个人
github地址

https://github.com/armink/CmBacktrace

gitee地址

https://gitee.com/Armink/CmBacktrace

使用说明介绍这个博主讲的挺详细的

https://blog.csdn.net/weiqifa0/article/details/120499893

然后大家自行搜索一下 addr2line 工具的说明即可

2:CmBackTrace代码修改适配

cmb_cfg.h 修改

#ifndef _CMB_CFG_H_
#define _CMB_CFG_H_
#include "mocar_log.h"#ifdef	CMB_USER_CFG
#include "cmb_user_cfg.h"
#else
/* print line, must config by user */
#define cmb_println(...)    log_print(SLOG_INFO, __VA_ARGS__);            /* e.g., printf(__VA_ARGS__);printf("\r\n")  or  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 or CMB_OS_PLATFORM_THREADX */
/* 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 or CMB_CPU_ARM_CORTEX_M33 */
/* 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 or CMB_PRINT_LANGUAGE_CHINESE_UTF8 */
#endif#endif /* _CMB_CFG_H_ */

cmb_def.h 修改
S32DS默认使用gcc编译器;
注意这里要结合.ld文件去里面的 SECTIONS{…}适配, 不同的.ld文件名称可能不一致;

......
#elif defined(__GNUC__)/* C stack block start address, defined on linker script file, default is _sstack */#ifndef CMB_CSTACK_BLOCK_START#define CMB_CSTACK_BLOCK_START         __Stack_dtcm_start#endif/* C stack block end address, defined on linker script file, default is _estack */#ifndef CMB_CSTACK_BLOCK_END#define CMB_CSTACK_BLOCK_END           __Stack_dtcm_end#endif/* code section start address, defined on linker script file, default is _stext */#ifndef CMB_CODE_SECTION_START#define CMB_CODE_SECTION_START         __text_start#endif/* code section end address, defined on linker script file, default is _etext */#ifndef CMB_CODE_SECTION_END#define CMB_CODE_SECTION_END           __text_end#endif
#else#error "not supported compiler"
#endif

task.c修改

......
/*适配CmBacktrace插件*/
uint32_t *vTaskStackAddr(void)
{return (uint32_t)pxCurrentTCB->pxStack;
}uint32_t vTaskStackSize(void)
{return (uint32_t)pxCurrentTCB - (uint32_t)pxCurrentTCB->pxStack - 4;
}char * vTaskName()
{return pxCurrentTCB->pcTaskName;
}

在现场里面自己写了个触发hard_fault的代码;参考例程里面的代码,测试不会产生 HardFault_Handler

/*cm_backtrace 临时测试产生hardfault的函数 */
#include "C40_Ip.h"
static void tmp_test_create_hardfault(void)
{C40_Ip_StatusType c40_erase_status=C40_IP_STATUS_ERROR;if (C40_IP_STATUS_SECTOR_PROTECTED == C40_Ip_GetLock(C40_CODE_ARRAY_0_BLOCK_0_S000)){C40_Ip_ClearLock(C40_CODE_ARRAY_0_BLOCK_0_S000, 0);}c40_erase_status = C40_Ip_MainInterfaceSectorErase(C40_CODE_ARRAY_0_BLOCK_0_S000, 0);if (c40_erase_status == C40_IP_STATUS_SUCCESS){        // 擦除之后必须调用该接口,不然会报 EHV 错误; 很容易就busy了...c40_erase_status = C40_Ip_MainInterfaceSectorEraseStatus();}
}

S32DS代码里面的 exceptions.c里面定义的是弱函数,重写之后自动覆盖了; 担心没有覆盖的话可以屏蔽掉

//void HardFault_Handler(void)            __attribute__ ((weak));         /* Hard Fault Handler */
......
//void HardFault_Handler(void)
//{
//    while(TRUE){};
//}

其它的再没修改什么通用的代码了,根据自己的工程初始化"cm_backtrace_init"之后,调用 "tmp_test_create_hardfault"函数即可

3:实测验证

代码烧写运行之后串口日志如下
Bus fault is caused by … 这里的故障原因就是分析 SCB寄存器的出来的

1969.12.31-23:59:59]info cm_backtrace_fault lr=0xfffffffd sp=0x2000ffe0
[1969.12.31-23:59:59]info Firmware name: FreeRTOS_S32K328, hardware version: hv_v1.0.0, software version: sv_v1.0.1
[1969.12.31-23:59:59]info Fault on thread TaskManager
[1969.12.31-23:59:59]info ===== Thread stack information =====
[1969.12.31-23:59:59]info stack_info pointer=0x20400ff8 addr=0x20400458 size=12272
[1969.12.31-23:59:59]info   addr: 20400ff8    data: 00000000
[1969.12.31-23:59:59]info   addr: 20400ffc    data: 00000000
[1969.12.31-23:59:59]info   addr: 20401000    data: 20401008
[1969.12.31-23:59:59]info   addr: 20401004    data: 0041ebf1
[1969.12.31-23:59:59]info   addr: 20401008    data: 00a5a5a5
[1969.12.31-23:59:59]info   addr: 2040100c    data: 00000010
[1969.12.31-23:59:59]info   addr: 20401010    data: 00400000
[1969.12.31-23:59:59]info   addr: 20401014    data: 00000000
[1969.12.31-23:59:59]info   addr: 20401018    data: 20401020
[1969.12.31-23:59:59]info   addr: 2040101c    data: 004110e1
[1969.12.31-23:59:59]info   addr: 20401020    data: 20400398
[1969.12.31-23:59:59]info   addr: 20401024    data: 00000002
[1969.12.31-23:59:59]info   addr: 20401028    data: 20401030
[1969.12.31-23:59:59]info   addr: 2040102c    data: 00411141
[1969.12.31-23:59:59]info   addr: 20401030    data: 00000000
[1969.12.31-23:59:59]info   addr: 20401034    data: 00000000
[1969.12.31-23:59:59]info ====================================
[1969.12.31-23:59:59]info =================== Registers information ====================
[1969.12.31-23:59:59]info   R0 : 00000000  R1 : 00000000  R2 : 402ec000  R3 : 00000000
[1969.12.31-23:59:59]info   R12: 0000000a  LR : 004407d3  PC : 004407d6  PSR: 61000000
[1969.12.31-23:59:59]info ==============================================================
[1969.12.31-23:59:59]info Bus fault is caused by instruction access violation
[1969.12.31-23:59:59]info Bus fault is caused by precise data access violation
[1969.12.31-23:59:59]info The bus fault occurred address is 00440810
[1969.12.31-23:59:59]info Show more call stack info by run: addr2line -e FreeRTOS_S32K328.elf -afpiC 004407d6 004407d2 0041ebf0 004110e0 00411140 004066f4 0040936e 

addr2line执行如下;我使用相对路径执行的,没有添加环境变量

PS D:\2_gitlab\S32K328\s32k328\FreeRTOS_S32K328\FreeRTOS_S32K328\src\mid\cm_backtrace\exe> .\addr2line.exe -e ..\..\..\..\Debug_FLASH\FreeRTOS_S32K328.elf -afpiC 004407d6 004407d2 0041ebf0 004110e0 00411140 004066f4 0040936e
0x004407d6: SchM_Exit_Mem_43_INFLS_MEM_EXCLUSIVE_AREA_10 at D:\2_gitlab\S32K328\s32k328\FreeRTOS_S32K328\FreeRTOS_S32K328\Debug_FLASH/../RTD/src/SchM_Mem_43_INFLS.c:797
0x004407d2: SchM_Exit_Mem_43_INFLS_MEM_EXCLUSIVE_AREA_10 at D:\2_gitlab\S32K328\s32k328\FreeRTOS_S32K328\FreeRTOS_S32K328\Debug_FLASH/../RTD/src/SchM_Mem_43_INFLS.c:795
0x0041ebf0: C40_Ip_MainInterfaceSectorErase at D:\2_gitlab\S32K328\s32k328\FreeRTOS_S32K328\FreeRTOS_S32K328\Debug_FLASH/../RTD/src/C40_Ip.c:2569      
0x004110e0: tmp_test_create_hardfault at D:\2_gitlab\S32K328\s32k328\FreeRTOS_S32K328\FreeRTOS_S32K328\Debug_FLASH/../src/task/manager/manager.c:243   
0x00411140: task_manage_thread at D:\2_gitlab\S32K328\s32k328\FreeRTOS_S32K328\FreeRTOS_S32K328\Debug_FLASH/../src/task/manager/manager.c:270
0x004066f4: xTaskResumeAll at D:\2_gitlab\S32K328\s32k328\FreeRTOS_S32K328\FreeRTOS_S32K328\Debug_FLASH/../FreeRTOS/Source/tasks.c:4102
0x0040936e: prvTimerTask at D:\2_gitlab\S32K328\s32k328\FreeRTOS_S32K328\FreeRTOS_S32K328\Debug_FLASH/../FreeRTOS/Source/timers.c:777 (discriminator 1)

最后附一张截图
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI研究引擎的简单技术实现步骤

产品愿景与核心功能 1.1 产品使命 “洞见 Weaver”是一个全栈AI Web应用,旨在将用户的复杂研究问题,通过AI驱动的动态思维导图和结构化报告,转化为一次沉浸式的、可追溯的视觉探索之旅。我们的使命是,将AI复杂的推理过程透明化,将人类的探索直觉与AI的分析能力无缝结合,…

open webui源码分析5-Tools

本文从最简单的时间工具入手,分析Tools相关的代码。一、安装工具git clone https://github.com/open-webui/openapi-servers cd openapi-servers# 进入时间工具目录 cd servers/timepip install -r requirements.txt# 启动服务 uvicorn main:app --host 0.0.0.0 --r…

windows下通过vscode远程调试linux c/cpp程序配置

windows下通过vscode远程调试linux c/cpp程序配置vscode插件配置linux依赖工具安装launch.json配置vscode插件配置 CodeLLDB插件需要提前下载: linux依赖工具安装 sudo apt update sudo apt install cmake clangdlaunch.json配置 {"version": "0…

IDEA报JDK版本问题

解决思路:1.找到配置jdk的IDEA配置位置settings和project structure2.先配置setting3.再修改项目结构

VirtualBox 安装 Ubuntu Server 系统及 Ubuntu 初始配置

文章目录简介VirtualBoxUbuntu Server 简介Ubuntu Server 下载安装 Ubuntu Server首选项配置导入系统镜像配置系统用户配置内存 CPU 虚拟硬盘开始安装 Ubuntu安装完成登录系统配置网络Ubuntu 系统配置安装常用工具安装 SSH设置 root 密码配置 IP 地址(推荐自动分配I…

Milvus 可观测性最佳实践

Milvus 介绍 Milvus 是一个开源的向量数据库,专为处理大规模、高维度向量数据而设计,广泛应用于人工智能、推荐系统、图像检索、自然语言处理等场景。它支持亿级向量的高效存储与快速检索,内置多种相似度搜索算法(如 HNSW、IVF、…

arcgis-空间矫正工具(将下发数据A的信息放置原始数据B的原始信息并放置到成果数据C中,主要按下发数据A的范围)

正常来说,可以直接相交获取,但是会存在原始数据B将下发数据A进行分割,所以相交功能会导致最终成果会产生稀碎图斑及图斑切割,因此,经学习了解,学会此方法进行既保留原始数据B的信息,又按下发数据…

MySQL深分页慢问题及性能优化

在数据驱动的应用中,分页是不可或缺的功能。然而,当数据量达到百万甚至千万级别时,传统基于 LIMIT OFFSET 的分页方式会遭遇严重的性能瓶颈,即“深分页”问题。本文将剖析其根源并提供主流的优化策略。问题根源:LIMIT …

漫谈《数字图像处理》之平滑

在数字图像处理中,平滑(Smoothing) 的核心目标是降低图像噪声、模糊细节或简化纹理,本质是通过 “局部邻域运算” 对像素值进行 “平均化” 或 “规整化”,让图像整体更 “平缓”。形态学平滑与高斯平滑、均值平滑等其…

机器学习之数据预处理学习总结

在机器学习中,数据预处理是模型训练前至关重要的环节,直接影响模型的性能和准确性。通过本次学习,我系统掌握了数据预处理的核心方法与工具,现将主要内容总结如下:一、缺失值处理缺失值是实际数据中常见的问题&#xf…

在完全没有无线网络(Wi-Fi)和移动网络(蜂窝数据)的环境下,使用安卓平板,通过USB数据线(而不是Wi-Fi)来控制电脑(版本2)

在完全没有无线网络(Wi-Fi)和移动网络(蜂窝数据)的环境下,要实现用安卓手机通过USB数据线控制电脑,核心思路是:利用USB数据线创建一個纯粹的、本地的有线网络连接。 这不仅是可行的,…

Ubuntu22.04配置网络上网

前言 安装Ubuntu系统后,有时会遇到无法联网、无法使用浏览器的问题。然而当宿主机已连接网络时,虚拟机通常也能联网,需要进行一些配置,现在就以Ubuntu22.04为例。 VMware配置打开虚拟网络编辑器 启动VMWare点击编辑,并…

网络协议之TCP和UDP

写在前面 本文来看下TCP和UDP协议。 我们接触这两个协议最多的应该就是在面试中了,经典题目就是“TCP和UDP有什么区别?”,而最常得到的答案就是TCP是面向连接的,而UDP是面向无连接的。 那么这里的连接到底是什么呢?难…

Qt音乐播放器项目实践:本地持久化与边角问题处理

本音乐播放器完整项目源码(包含各个按钮的图片文件): ly/Project-Code - Gitee.com 一.本地持久化 请注意,学习此部分之前需要读者具有一定的Mysql基础。如果读者能够接受无法本地持久化,那么可以跳过这部分内容,直接去看边角问题处理。我…

基于NB-IoT技术的宠物定位跟踪系统设计#基于STM32\物联网\单片机技术的宠物定位跟踪系统

基于NB-IoT技术的宠物定位跟踪系统设计#基于STM32\物联网\单片机技术的宠物定位跟踪系统在设计基于NB-IoT技术的宠物定位跟踪系统时,首先明确了系统分为感知层、网络层和应用层三个部分。在感知层,考虑到需要获取宠物位置和运动状态,选用GPS定…

【入门级-算法-3、基础算法:递归法】

递归是一种非常重要的算法思想,它指的是函数调用自身的过程。递归通常包含两个主要部分:基线条件(终止条件)和递归条件(调用自身的条件)。 下面通过例子来理解递归算法: 计算阶乘 阶乘的递归定义…

【CS创世SD NAND征文】存储芯片在工业电表中的应用与技术演进

【CS创世SD NAND征文】存储芯片在工业电表中的应用与技术演进1.工业电表的市场背景2.技术方案分析3.核心技术特性3.1.主控芯片:APM32F465VET63.3.存储芯片:CSNP4GCR01-DPW3.3.1. 基本概述3.3.2. 核心特性3.3.3. 优势特点3.3.4 四大管理算法4.存储芯片性能…

建筑施工遮挡场景漏检率↓76%:陌讯动态融合算法实战解析

原创声明 本文为原创内容,技术参数及架构解析引用自《陌讯技术白皮书》,未经授权禁止转载。 一、行业痛点:建筑施工安全监控的 "看得见" 与 "看不准" 建筑施工场景的安全监控长期面临双重挑战:一方面&…

【LeetCode题解】LeetCode 209. 长度最小的子数组

【题目链接】 209. 长度最小的子数组 【题目描述】 【题解】 方法一:滑动窗口 本题可以使用双指针算法,定义两个指针l和r分别表示子数组的开始位置和起始位置,sum数组存储的从l到r区间内所有元素的和。初始状态下,l和r都指向下…

2025-08-21 Python进阶6——迭代器生成器与with

文章目录1 迭代器与生成器1.1 迭代器1.1.1 基本使用1.1.2 手动迭代(带异常处理)1.1.3 自定义迭代器1.2 生成器1.2.1 工作原理1.2.2 斐波那契数列示例1.3 推导式1.3.1 列表推导式1.3.2 字典推导式1.3.3 集合推导式1.4.4 元组推导式(生成器表达…