S32K328(Arm Cortex-M7)適配CmBacktrace錯誤追蹤

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 元組推導式(生成器表達…