MCU 軟件斷點注意事項!!!

——為什么調試器會在運行中改我的Flash程序?

調試單片機時,很多人都有這樣的疑問:

明明我在調試前刷進去的固件是好的,為什么加了一個斷點之后,調試器居然去改了 Flash?
如果我拔掉調試器,這個固件還能正常跑嗎?

今天我們就來完整講一講**軟件斷點(Software Breakpoint)**的原理,以及它和 MCU Flash 之間的關系。


1. 什么是斷點?

調試器要讓程序在某一行停下來,有兩種方法:

斷點類型原理數量限制速度是否改寫代碼
硬件斷點利用 MCU 內部的 FPB(Flash Patch and Breakpoint) 單元,在指令地址匹配時自動中斷一般 4~6 個極快
軟件斷點直接把目標指令改成一條特殊的“陷阱指令”(如 BKPT理論無限(可寫內存)RAM 中快,Flash 中慢

所以,ST-Link / J-Link / DAPLink 這些調試器本質上都一樣,只是硬件斷點數量受 MCU 限制,而軟件斷點理論上可以很多,但需要改寫代碼。


2. 軟件斷點的工作原理

以 ARM Cortex-M 為例,軟件斷點的流程是這樣的:

  1. 下斷點
    調試器接收到“在地址 0x08001234 停下來”的指令。

  2. 備份原指令
    從 MCU 讀出該地址的機器碼(2 字節或 4 字節),保存到調試器內存。

  3. 寫入陷阱指令
    將該位置改成 BKPT #imm(機器碼通常是 0xBE00)。

  4. 運行時觸發異常
    CPU 執行到 BKPT → 進入 Debug 模式 → 調試器接管。

  5. 恢復原指令
    當你“移除斷點”或“單步執行”時,調試器把原機器碼寫回去。

關鍵點

  • 如果斷點地址在 RAM 中,直接寫就行,很快,也不會磨損。

  • 如果斷點地址在 Flash 中,就必須擦除整頁 → 改一條指令 → 回寫整頁,這會稍微慢一些,還會增加 Flash 擦寫次數。


3. 為什么調試器會改 Flash?

因為軟件斷點就是修改原程序的一個過程。

  • 硬件斷點不改代碼,但數量有限。

  • 軟件斷點數量無限,但需要替換原來的指令為 BKPT。

  • 在 Flash 中替換指令 → 必須擦寫 Flash。

這也解釋了兩個現象:

  1. 加 Flash 斷點有延遲:那是擦寫 Flash 的時間(幾十到幾百微秒)。

  2. 斷點太多可能會磨損 Flash:雖然調試時次數不多,但確實有寫入動作。


4. 調試結束后的風險

大多數調試器在結束調試時,會自動恢復原指令
但在以下情況可能會殘留 BKPT:

  • IDE / 調試器崩潰;

  • 直接拔掉 USB / 斷電;

  • 固件編譯時手動寫了 __BKPT(),且 Release 版沒屏蔽。

如果 BKPT 留在 Flash 里,MCU 在無調試器連接的情況下運行到這里:

  • 會觸發 HardFaultDebug Monitor Exception

  • 如果程序沒有異常處理,就會直接死機。


5. 如何避免死機

  1. 發布版本不用軟件斷點
    確保 Release 固件是干凈的,不帶調試指令。

  2. 異常處理里跳過 BKPT
    在 HardFault Handler 中檢查指令,如果是 BKPT,就跳過它:

    void HardFault_Handler(void) {uint32_t *pc = (uint32_t *)__get_MSP();if (*(uint16_t *)(*pc) == 0xBE00) { // BKPT*pc += 2; // 跳過斷點指令return;}while (1); // 其他錯誤
    }
    

  3. 調試結束前移除斷點
    養成好習慣,不要讓調試器崩潰時處于有斷點的狀態。


6. 總結

  • 硬件斷點:靠 MCU 內部比較器實現,不改代碼,速度快但數量有限。

  • 軟件斷點:通過改指令(RAM 直接寫,Flash 要擦寫)實現,數量無限但會改程序。

  • 調試結束時如果 BKPT 沒被恢復,獨立運行可能直接死機。

  • 最安全的做法是:發布固件前移除所有軟件斷點,并做好異常處理。

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

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

相關文章

騰訊iOA:數據安全的港灣

聲明:文章為本人真實測評,非廣告,無推廣,為用戶體驗文章 前言 當前網絡安全威脅日益復雜化,惡意軟件攻擊手段不斷升級。例如:釣魚郵件攜帶的偽裝安裝包可能引發勒索病毒在內網擴散,導致業務中斷…

相冊管理系統介紹

之前在github和gitee上了找了好久也沒找到符合自己需求的相冊管理系統,最近就靜下心來自己寫了一套。系統分為前臺相冊系統與后臺管理系統。 技術框架采用的是前端vueelementui,后端springbootmybatisplus。 下面是項目截圖:項目功能介紹&…

企業級高性能WEB服務器Nginx

nginx安裝 1.nginx編譯安裝 #在nginx官網獲取安裝包 [rootwebserver mnt]# wget https://nginx.org/download/nginx-1.24.0.tar.gz#解壓安裝包 [rootwebserver mnt]# tar zxf nginx-1.24.0.tar.gz [rootwebserver mnt]# cd nginx-1.24.0/#安裝編譯nginx需要的環境軟件 [rootw…

【Node.js從 0 到 1:入門實戰與項目驅動】1.3 Node.js 的應用場景(附案例與代碼實現)

文章目錄1.3 Node.js 的應用場景(附案例與代碼實現)1.3 Node.js 的應用場景(附案例與代碼實現)一、Web 服務器開發二、API 開發三、命令行工具(CLI)開發四、實時應用開發小結1.3 Node.js 的應用場景&#x…

No time to train! Training-Free Reference-Based Instance Segmentation之論文閱讀

摘要 圖像分割模型的性能歷來受到大規模標注數據收集成本高昂的制約。Segment Anything Model(SAM)通過一種可提示、與語義無關的分割范式緩解了這一根本問題,但在處理新圖像時,仍然需要手動提供視覺提示或依賴復雜的領域相關提示…

本地文件夾與 GitHub 遠程倉庫綁定并進行日常操作的完整命令流程

以下是將本地文件夾與 GitHub 遠程倉庫綁定并進行日常操作的完整命令流程,特別針對你的需求(忽略數據集、偏好使用 rebase 保持主分支整潔)進行了優化: 一、初始設置(首次綁定)在本地項目文件夾初始化 Git …

windows10 ubuntu 24.04 雙系統 安裝教程

準備windows安裝包解壓到u盤中作為啟動盤準備ubuntu安裝包https://ubuntu.com/download/desktop/thank-you?version24.04.3&architectureamd64<strue解壓到u盤中作為啟動盤準備磁盤分區安裝windows操作系統安裝disk geniusWindows 三個NTFS的分區System: windows操作系…

騰訊前端面試模擬詳解

以下是騰訊及騰訊音樂娛樂&#xff08;TME&#xff09;前端崗位高頻手撕題目詳解&#xff0c;結合真題及考察要點整理&#xff0c;覆蓋面試核心考點&#xff1a;?? 一、核心手撕題&#xff08;騰訊/TME 必考&#xff09; 1. Promise 并發控制&#xff08;90%場次出現&#xf…

微軟將于 10 月停止混合 Exchange 中的共享 EWS 訪問

使用 Exchange 混合部署的組織應為未來幾個月即將生效的新變化做好準備。微軟已宣布&#xff0c;自 2025 年 8 月起&#xff0c;將在某些混合環境中暫時阻止使用 Exchange Online 共享服務主體的 Exchange Web 服務 (EWS) 流量。 此項變更主要影響使用“豐富共存”功能的組織&a…

STM32CubeMX + HAL 庫:用硬件IIC接口實現AT24C02 EEPROM芯片的讀寫操作

1 概述1.1 實驗目的本實驗旨在通過 STM32 微控制器的硬件 IC 接口&#xff0c;對 AT24C02 外部 EEPROM 存儲芯片 進行讀寫操作。實驗演示了芯片地址配置、單字節/多字節讀寫、跨頁寫入&#xff08;Page Write&#xff09;功能。并提供完整的驅動代碼&#xff0c;幫助讀者深入理…

基于Android的音樂播放器/基于android studio的音樂系統/音樂管理系統

原生APP安卓開發設計之基于Android的音樂播放器/音樂系統/音樂管理系統[springboot]android studio

OmniHuman:字節推出的AI項目,支持單張照片生成逼真全身動態視頻

本文轉載自&#xff1a;OmniHuman&#xff1a;字節推出的AI項目&#xff0c;支持單張照片生成逼真全身動態視頻 - Hello123。 ** 一、核心產品定位 OmniHuman 是字節跳動研發的 AI 視頻生成技術&#xff0c;通過單張圖像&#xff08;真人 / 動漫 / 3D 角色&#xff09;和音頻…

5種無需USB線將照片從手機傳輸到筆記本電腦的方法

Android手機和平板電腦非常適合查看照片&#xff0c;因為這些移動設備可以隨身攜帶&#xff0c;隨時隨地查看文件。然而&#xff0c;移動設備的存儲空間非常有限&#xff0c;而且很容易丟失或損壞。因此&#xff0c;將重要的照片從Android設備傳輸到電腦進行備份是非常明智的決…

2025年滲透測試面試題總結-14(題目+回答)

安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 九十一、Android APP 逆向分析步驟 九十二、SQL注入分類 九十三、SQL注入防御 九十四、序列化與反序列化…

PG靶機 - Flu

一、初步偵察與服務識別 1.1 端口掃描 首先對目標主機 192.168.122.41 進行全端口掃描&#xff0c;以發現其上開放的網絡服務。 sudo nmap 192.168.122.41 -p- --min-rate5000 -A圖1: Nmap掃描結果&#xff0c;顯示開放22, 8090, 和 8091端口 掃描結果顯示&#xff0c;目標開放…

【Leetcode】隨筆

文章目錄題目一&#xff1a;路徑總和 II&#xff08;LeetCode 113&#xff09;題目分析&#xff1a;解題思路&#xff1a;示例代碼&#xff1a;代碼解析&#xff1a;題目二&#xff1a;顏色分類&#xff08;LeetCode 75&#xff09;題目分析&#xff1a;解題思路&#xff1a;示…

深入 FastMCP 源碼:認識 tool()、resource() 和 prompt() 裝飾器

在使用 FastMCP 開發 MCP 服務器時經常會用到 mcp.tool() 等裝飾器。雖然它們用起來很簡單&#xff0c;但當作黑匣子總讓人感覺"不得勁"。接下來我們將深入相關的源碼實現&#xff0c;別擔心&#xff0c;不會鉆沒有意義的“兔子洞”&#xff0c;你可以通過這篇文章了…

Spring Boot 2.0 升級至 3.5 JDK 1.8 升級至 17 全面指南

一、版本升級背景升級動機 Spring Boot 2.0 到 3.5 的重大更新&#xff08;如Jakarta EE 9包路徑變更、GraalVM支持等&#xff09;JDK 1.8 到 17 的語言特性升級&#xff08;如sealed class、record等&#xff09;安全性與性能優化需求升級目標 兼容性驗證依賴庫版本適配代碼兼…

級數學習筆記

級數學習筆記 一、數學基礎 1. 數項級數&#xff08;Number Series&#xff09; 數項級數是指形如&#xff1a; ∑(n1 to ∞) a? a? a? a? ...的無窮和。 1.1 收斂性判別法 比較判別法比值判別法根值判別法積分判別法萊布尼茨判別法&#xff08;交錯級數&#xff09; 2…

Linux811 YUM;SHELL:if else fi,for

vsftpdok [rootweb ~]# vim vsftpdok.sh 您在 /var/spool/mail/root 中有新郵件 [rootweb ~]# cat vsftpdok.sh rpm -ql vsftpd >/dev/null 2>&1 if [ $? -eq 0 ];then echo "OK" else yum install vsftpd -y if [ $? -eq 0 ];then echo "install o…