stm32觸發硬件錯誤位置定位

1.背景?

1. 項目中,調試過程或者測試中都會出現程序跑飛問題,這個時候問題特別難查找。

2. 觸發硬件錯誤往往是因為內存錯誤。這種問題特別難查找,尤其是產品到了測試階段,而這個異常復現又比較難的情況下,簡直頭疼。

3. 我目前的工作完全是沒有調試器的,代碼都是寫好了,通過bootloader燒寫進去的。也就意味著不能在void HardFault_Handler(void)中打斷點,然后通過當前lr寄存器中的值查看異常地址。

參考:

STM32進入HardFault_Handler的調試方法-電子工程世界 (eeworld.com.cn)

Keil環境下STM32定位hardfault位置方法和遇到的情況 - 張士玉小黑屋 (zhangshiyu.com)

還參考了很多文章, 有些寫的時候都關掉了, 這里就不列出來了.?

2.裸機程序觸發硬件錯誤

裸機觸發硬件錯誤時, R14(LR)寄存器的值為0xFFFFFFF9,此時看的是MSP指針保存的棧頂地址,然后在Memory Window中輸入這個值(0x20000738),第6個值就是錯誤退的地址(也就是我這個空指針的地址),查看.map文件,顯然我們的0x080001D1在0x080001cd(my_test在flash的首地址)和0x080001d3(my_test1在flash的首地址)之間。因此我們就可以定位出錯誤就在my_test()這個函數中。

?也可以查看匯報,看到地址(不過這里看起來有點讓人蒙圈)

3.RTOS程序觸發硬件錯誤

?RTOS觸發硬件錯誤時, R14(LR)寄存器的值為0xFFFFFFFD, 此時看的是PSP中的棧頂地址。同上分析,我們最終也能通過.map定位錯誤發生的位置。

補充知識:為什么裸機的是0xFFFFFFF9(9:1001)而多線程的是0xFFFFFFFD(1101),如下圖,bit2是區別的關鍵,后面打印錯誤需要用到這一點。

4.在硬件錯誤中斷打印這些值

我們最終的目的,就是在觸發硬件中斷的時候,要將這些值打印出來,從而準確定位出是哪個函數造成的錯誤。?

typedef struct
{u32 R0;u32 R1;u32 R2;u32 R3;u32 R12;u32 LR;u32 PC;u32 xPSR;
}STACK_DATA_TYPE;
void NotOSHardFault_Handler(u32 msp_addr)
{STACK_DATA_TYPE *p;             //堆棧中存儲的數據printf("\r\n-----------------ERROR -----------------\r\nHardFault_Handler\r\n");p = (STACK_DATA_TYPE *)msp_addr;printf("R0:0x%08X\r\n", p->R0);printf("R1:0x%08X\r\n", p->R1);printf("R2:0x%08X\r\n", p->R2);printf("R3:0x%08X\r\n", p->R3);printf("R12:0x%08X\r\n", p->R12);printf("LR:0x%08X\r\n", p->LR);printf("PC:0x%08X\r\n", p->PC);printf("xPSR:0x%08X\r\n", p->xPSR);printf("系統即將復位 ...\r\n");
}void HardFault_Handler(void)
{/* Go to infinite loop when Hard Fault exception occurs */
int msp, psp;msp = __get_MSP();NotOSHardFault_Handler(msp);psp = __get_PSP();NotOSHardFault_Handler(psp);while (1){}
}

當前還有一個問題需要解決, 我無法獲取lr寄存器中保存的值, 也就是說我無法準確的確定是進程堆棧出錯還是主堆棧出錯.(我測試了發現在rtos中, 如果讓錯誤放在main函數中, 此時MSP堆棧指向的位置是出錯位置, 如果讓錯誤放在任務中, 此時PSP堆棧指向的位置是出錯位置, 如果在裸機程序中, 通過MSP查找, 當前我用的是keil編譯的,我不知道IAR里面是否有__get_MSP(), __get_PSP())

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/710974.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/710974.shtml
英文地址,請注明出處:http://en.pswp.cn/news/710974.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

初學JavaScript總結

0 JavaScript html完成了架子,css做了美化,但是網頁是死的,需要給他注入靈魂,所以接下來需要學習JavaScript,這門語言會讓頁面能夠和用戶進行交互。JavaScript又稱為腳本語言,可以通過腳本實現用戶和頁面的…

每日shell腳本之打印99乘法表

每日shell腳本之打印99乘法表 #!/bin/bash for i in $(seq 1 9); dofor j in $(seq 1 9); doecho -n "$i * $j $(($i * $j)) "doneecho done

Programming Abstractions in C閱讀筆記:p306-p307

《Programming Abstractions in C》學習第75天,p306-p307總結,總計2頁。 一、技術總結 1.Quicksort algorithm(快速排序) 由法國計算機科學家C.A.R(Charles Antony Richard) Hoare(東尼.霍爾)在1959年開發(develop), 1961年發表…

Mac 制作可引導安裝器

Mac 使用U盤或移動固態硬盤制作可引導安裝器(以 Monterey 為例) 本教程參考 Apple 官網相關教程 創建可引導 Mac OS 安裝器 重新安裝 Mac OS 相關名詞解釋 磁盤分區會將其劃分為多個單獨的部分,稱為分區。分區也稱為容器,不同容器…

VR虛擬現實技術應用到豬抗原體檢測的好處

利用VR虛擬仿真技術開展豬瘟檢測實驗教學確保生豬產業健康發展 為了有效提高豬場豬瘟防控意識和檢測技術,避免生豬養殖業遭受豬瘟危害,基于VR虛擬仿真技術開展豬瘟檢測實驗教學數據能大大推動基層畜牧養殖業持續穩步發展保駕護航。 一、提高實驗效率 VR虛…

鯤鵬arm64架構下安裝KubeSphere

鯤鵬arm64架構下安裝KubeSphere 官方參考文檔: https://kubesphere.io/zh/docs/quick-start/minimal-kubesphere-on-k8s/ 在Kubernetes基礎上最小化安裝 KubeSphere 前提條件 官方參考文檔: https://kubesphere.io/zh/docs/installing-on-kubernetes/introduction/prerequi…

基于大模型思維鏈(Chain-of-Thought)技術的定制化思維鏈提示和定向刺激提示的心理咨詢場景定向ai智能應用

本篇為個人筆記 記錄基于大模型思維鏈(Chain-of-Thought)技術的定制化思維鏈提示和定向刺激提示的心理咨詢場景定向ai智能應用 人工智能為個人興趣領域 業余研究 如有錯漏歡迎指出!!! 目錄 本篇為個人筆記 記錄基…

價格腰斬,騰訊云2024優惠活動云服務器62元一年,多配置報價

騰訊云服務器多少錢一年?62元一年起,2核2G3M配置,騰訊云2核4G5M輕量應用服務器218元一年、756元3年,4核16G12M服務器32元1個月、312元一年,8核32G22M服務器115元1個月、345元3個月,騰訊云服務器網txyfwq.co…

Node.js中的并發和多線程處理

在Node.js中,處理并發和多線程是一個非常重要的話題。由于Node.js是單線程的,這意味著它在任何給定時間內只能執行一個任務。然而,Node.js的事件驅動和非阻塞I/O模型使得處理并發和多線程變得更加高效和簡單。在本文中,我們將探討…

【排坑】搭建 Karmada 環境

git clone 報錯 問題:Failed to connect to github.com port 443:connection timed out 解決: git config --global --unset http.proxy【hack/local-up-karmada.sh】 1. karmada ca-certificates (no such package) 問題:fetching http…

老化的電動車與高層電梯樓的結合,將是巨大的安全隱患

中國是全球最大的電動汽車市場,其實中國還是全球最大的電動兩輪車市場,而電動兩輪車的老化比電動汽車更快,電動汽車的電池壽命可以達到10年,而電動兩輪車的電池壽命只有3-5年,而首批電動兩輪車至今已老化得相當嚴重&am…

【Pytorch深度學習開發實踐學習】【AlexNet】經典算法復現-Pytorch實現AlexNet神經網絡(1)model.py

算法簡介 AlexNet是人工智能深度學習在CV領域的開山之作,是最先把深度卷積神經網絡應用于圖像分類領域的研究成果,對后面的諸多研究起到了巨大的引領作用,因此有必要學習這個算法并能夠實現它。 主要的創新點在于: 首次使用GPU…

AI語音識別的技術解析

從語音識別算法的發展來看,語音識別技術主要分為三大類,第一類是模型匹配法,包括矢量量化(VQ) 、動態時間規整(DTW)等;第二類是概率統計方法,包括高斯混合模型(GMM) 、隱馬爾科夫模型(HMM)等;第三類是辨別器…

golang gin單獨部署vue3.0前后端分離應用

概述 因為公司最近的項目前端使用vue 3.0,后端api使用golang gin框架。測試通過后,博文記錄,用于備忘。 步驟 npm run build,構建出前端項目的dist目錄,dist目錄的結構具體如下圖 將dist目錄復制到后端程序同級目錄…

嵌入式軟件bug從哪里來,到哪里去

摘要:軟件從來不是一次就能完美的,需要以包容的眼光看待它的殘缺。那問題究竟為何產生,如何去除呢? 1、軟件問題從哪來 軟件缺陷問題千千萬萬,主要是需求、實現、和運行環境三方面。 1.1 需求描述偏差 客戶角度的描…

PSO-CNN-LSTM多輸入回歸預測|粒子群算法優化的卷積-長短期神經網絡回歸預測(Matlab)——附代碼數據

目錄 一、程序及算法內容介紹: 基本內容: 亮點與優勢: 二、實際運行效果: 三、算法介紹: 四、完整程序數據分享下載: 一、程序及算法內容介紹: 基本內容: 本代碼基于Matlab平臺…

5 局域網基礎(3)

1.AAA 服務器 AAA 是驗證、授權和記賬(Authentication、Authorization、Accounting)3個英文單詞的簡稱,是一個能夠處理用戶訪問請求的服務器程序,提供驗證授權以及帳戶服務,主要目的是管理用戶訪問網絡服務器,對具有訪問權的用戶提供服務。AAA服務器通常…

Java TCP文件上傳案例

文件上傳分析 【客戶端】輸入流,從硬盤讀取文件數據到程序中。【客戶端】輸出流,寫出文件數據到服務端。【服務端】輸入流,讀取文件數據到服務端程序。【服務端】輸出流,寫出文件數據到服務器硬盤中。 基本實現 服務端實現 pu…

【二分查找】樸素二分查找

二分查找 題目描述 給定一個 n 個元素有序的(升序)整型數組 nums 和一個目標值 target ,寫一個函數搜索 nums 中的 target,如果目標值存在返回下標,否則返回 -1。 示例 1: 輸入: nums [-1,0,3,5,9,12], target 9…

網絡編程:基于TCP和UDP的服務器、客戶端

1.基于TCP通信服務器 程序代碼&#xff1a; 1 #include<myhead.h>2 #define SER_IP "192.168.126.121"//服務器IP3 #define SER_PORT 8888//服務器端口號4 int main(int argc, const char *argv[])5 {6 //1.創建用于監聽的套接字7 int sfd-1;8 sf…