在用 Keil 做調試的時候,最讓人頭禿的是什么?
不是寫代碼的BUG,而是:這個條件變量是什么情況?為什么沒進入這個判斷?我代碼跑到哪里了?
其實本質上都是通過變量判斷代碼的執行順序有沒有問題
還有需要觀察變量的變化就像看天象,得不停地點進去、刷新,點進去、刷新……
想偷個懶用串口傳到上位機畫波形?可以,但要加代碼啊兄弟!
用 printf
打印?你以為你在寫 PC 軟件呢?嵌入式的資源浪費不起啊
那有沒有既不寫一堆代碼、又能實時觀察變量并支持可視化顯示的神器?
答案是:有的,兄弟
我們今天就來聊聊兩種“既要又要還要”的調試法寶,它們的原理都類似:
通過調試協議直接訪問 MCU 的內存,像“讀心術”一樣看變量的變化。
1.FreeMASTER
安裝教程:https://blog.csdn.net/WL0616/article/details/129378813
額外強調:
FreeMaster 中 Plug-in Module 顯示空白的問題
解決辦法:打開FreeMaster的安裝目錄,找到register.bat文件,以管理員的身份運行一下就好了。
使用教程:https://www.bilibili.com/video/BV17D421V7LY/
安裝包:\LabNas\公共資料\軟件庫\FMASTERSW32.exe
2.STM32CubeMonitor
st公司開發的工具,比上一個的功能更多,類似搭積木的方法,但個人感覺多出來的功能用不上。
具體觀看視頻有更詳細的介紹
https://www.bilibili.com/video/BV1th4y1g7Mc/
3.測試
由于網上已經有比較詳細的安裝教程和使用說明,我就不重復寫了,我們關注一下一個很重要的問題:
使用FreeMASTER監控數據的過程是否會導致單片機執行變慢?
這是一個靈魂拷問。要是你單片機跑得好好的,但加了個FreeMASTER看看變量的變化,結果如同中斷一樣是不是插個任務進來打斷正常的任務執行,那豈不是一個亂套了?
好消息是:不會
FreeMASTER 和調試器溝通用的是調試協議(比如 SWD、JTAG),而不是走你程序里的串口、I2C 這些“正經業務通道”。
它是通過調試接口在后臺“偷看”變量的,不打斷你程序的執行流程,就像后排觀眾戴望遠鏡看舞臺,不會跑上臺搶戲。
當然,這里也不是說完全沒代價——如果你監控的變量特別多、刷新頻率特別快,也可能讓調試器“喘不過氣”,刷新速度跟不上節奏,但這只是顯示延遲,MCU 本體依舊在認真打工。
一句話總結:FreeMASTER更像是一個安靜的觀察者,不吭聲、不添亂,悄悄記錄你程序的點點滴滴。
實驗
口說無憑,我設計了一個簡單的測試demo:思路很簡單,通過硬件定時器計時一段累加變量的代碼執行時間,看正常不干預的運行時間和使用FreeMASTER監控變量的運行時間是否有變化。
測試單片機:STM32F103C8T6
核心測試代碼:
uint32_t count = 0;int main(void)
{Serial_Init();Timer_Init(); //1usTIM2->CNT = 0;TIM_Cmd(TIM2, ENABLE);for (count = 0; count < 100 * 1000; count++) {}TIM_Cmd(TIM2, DISABLE);Serial_Printf("cnt=%d\r\n", TIM2->CNT);while (1) {}
}
注意編譯選項要選擇-o0(無編譯優化),防止代碼中無操作的for循環被優化了
測試結果
正常運行
cnt=52778
使用FreeMASTER監控變量
cnt=52778
FreeMASTER監控變量count的波形圖
兩次測試后對比發現所消耗的時間完全相同,證明了使用FreeMASTER監控變量并不會占用MCU的運算資源。