CM3 除錯系統簡析
**“一直以來,微控制器的除錯一直不是很突出的主題,很多簡單些的程式在開發中,甚至都沒有除錯的概念,而只是把生成的映像直接燒入片子,再根據錯誤症狀來判斷問題,然後修改程式重新燒,週而復始,直到問題解決或放棄為止。” **
—《Cortex-M3 權威指南》
大部分初學者在學習嵌入式軟體時,往往只注重函式 API 的使用和功能的實現,對於除錯工具的使用往往不求甚解,殊不知,熟練使用除錯工具對嵌入式裝置進行故障排查往往是必不可少的技能。
為什麼我們需要使用微控制器除錯?你可能會問這個問題
暢想一下,當程式碼有好幾個分支時,我們想知道當前程式碼執行的是哪個分支,或程式碼執行到某一步時,某個變數的值是多少,抑或是我們想知道某個函式被呼叫了幾次、執行時間是多少?
你可能會說:誒,你看我可以用 LED 狀態指示燈來判斷當前程式碼的執行情況啊,我還能用這個串列埠通訊輸出變數的值,我看那個串列埠上位機軟體接收時間不就能知道程式碼執行時間了嘛。
沒毛病,這個方法的的確確可以,不過有十分大的限制性:
其一:程式碼分支複雜情況下無法判斷程式碼執行情況;
其二:無法精確知道程式碼的執行時間,譬如要求精確到 us 級別;
其三:在功能無法正常執行時,無法進行除錯,比如時鐘初始化就有問題,後面程式碼都無法執行。
同時,想象一下如下情況,我們想要同時完成:
(1)使用 ADC 外設掃描八個通道電壓值,取樣率為 1KHz,我們想知道每個時間點上八個通道的電壓值;
(2)與此同時,我們還使用了串列埠外設,我們想知道某個串列埠在某種情況下某個暫存器的值;
(3)在某個程式碼段的某種情況下總是出現 bug,我們想讓微控制器執行一次程式碼就暫停一下,同時檢視程式碼中相關變數的值和相關暫存器狀態;
(4)整套程式還使用了 RTOS,我們想知道每個任務的執行時間和執行順序。
此時,你會發現基於串列埠通訊資料輸出的“除錯方法”不再適用。
你:不慌,你看,我們可以建立一個定時器中斷服務程式,利用串列埠外設,軟體定時解析從 PC 端傳送的各種指令,對指令進行解析輸出暫存器或者變數的值,對各個任務也可以利用 CPU 主頻和多個計數變數完成對任務的執行時間和執行順序的解析。除了不能一步一步執行程式外,照樣可以滿足其他功能。
**確實,可以,但只限在 MCU 速率較低的情況下,實際上 51 微控制器的除錯工具 ISD51 線上除錯模式下就是這麼幹的,ISD51 在 8051 系統裡增加了一個串列埠中斷函式 (ISD51 中斷) 。當 ISD51 連線到 uVision 偵錯程式時, 8051 輸入 ISD51 的中斷函式。只要到程式執行一被停止, 8051 就只執行 ISD51 中斷服務程式。當 uVision2 偵錯程式發出一個"Go"的指令, 8051 就脫離 ISD51 中斷函式並且執行使用者程式。 **
問題是,該方法會使得程式執行效率大大降低,對於 ISD51 線上模式來說,它的除錯會使得程式執行速度將會比原來慢 100 倍,這將使得原本需要高速執行的程式無法正常工作,導致時序出現重大問題。
影片課程可以檢視以下連結:
bilibili:https://www.bilibili.com/video/BV1bs4y1k7uT?t=2.2
原文件可以在以下連結下載:
Github:https://github.com/leezisheng/Doc