MDK debug調試方法
- 使用仿真器進行線上調試
-
- ⭐基礎調試方法
-
- 調試環境的配置
- 調試界面介紹
-
- 執行操縱欄
- 斷點
- 挂起
- 調試視窗介紹
-
- call stack windows
- watch windows
- peripheral工具欄
- ⭐進階調試方法
-
- 區段函數執行時間
- Memory檢視寄存器位址
- 檢視中斷執行的時間和次數
- 全局變量讀寫時暫停
使用仿真器進行線上調試
硬體環境:STM32F407VET6核心闆
軟體環境:Keil 5.0
分類:此類為【技巧型】知識,需要多加練習才能掌握
你可以學到:如何通過MDK的自帶的調試功能進行調試與檢查可能出現的問題
⭐基礎調試方法
調試環境的配置
- 配置好debug:點選魔術棒 在Debug-setting選項中進行如下配置:
左側和仿真器型号相關,右側和單片機型号相關。
如果出現:
左邊檢測不到,是因為沒有連結電腦
右邊檢測不到,是因為沒有連接配接開發闆
如果:
兩側都有顯示,說明可以進行下載下傳和調試,進入下一步調試階段。
- 點選放大鏡即可進入
調試界面介紹
執行操縱欄
分别是複位/程式運作/停止
複位:程式重頭開始執行,(可以和斷點進行配合使用)
Run:使程式正常進行
挂起:停止正在運作的程式
進入函數/執行過此函數/跳出函數/執行到光标處
這些按鈕可以控制函數的執行流程,用以動态的檢視函數的工作和運作
斷點
隻有在灰色區域可以設定斷點
上圖中,【黃色箭頭】是程式執行到的地方/【綠色箭頭】是光标所在地方
可以設定斷點狀态:
插入斷點、使能/失能斷點、失能所有斷點、清楚所有斷點。
這些選項可以對斷點進行管理,友善使用斷點。
【注意】點選 run 是執行到斷點處,(此時斷點所在的行【沒有】被執行),斷點是:即将執行某一行代碼。
除了設定斷點之外,還可以設定挂起:
挂起
挂起:程式執行到某個地方突然被中斷
與斷點的差別:挂起并不知道在哪裡停下,知識知道在發生什麼事件後停下,這個事件可以通過外部的标志進行判斷
調試視窗介紹
先介紹比較常用的幾個視窗
call stack windows
顯示正在執行的程式中,函數的調用情況
點開後,是下列界面:
第一列是函數名稱/第二列是函數位址或者函數值(傳回值)第三列是函數類型
同時可以檢視函數内部的局部變臉。
使用的時候,不需要将函數拖進去,就可以檢視函數内部局部變量的值。
這裡思考一個問題:為什麼函數中的局部變量的值要在堆棧裡檢視?
猜測:因為C語言中調用函數内部的局部變量,是在調用時生成,調用結束後銷毀的,
用堆棧存放這些變量,可能是考慮到了函數的嵌套調用的情況,
在函數調用完畢後,最後一個被存儲的局部變量第一個被銷毀。剛好符合堆棧後進先出的原則。
watch windows
直接将某個函數或者變量拖進來,就可以顯示該函數或者變量的值。
如下圖所示:
這樣可以很友善的在調試過程中檢視寄存器或者變量的情況。(函數對應的是函數入口位址)
需要特别注意MDK的優化問題
一定要使用level-0優化方式,否則優化登記太高,将不會顯示某些變量的值,導緻一些變量一直處于< not in scope>的狀态
優化的選項在魔術棒中,如下圖
peripheral工具欄
在這個工具欄下,幾乎可以選擇所有的片内外設,點開後,會顯示外設的寄存器的所有狀态
我們依照這些寄存器狀态,去和資料手冊進行比對,進而可以找出問題或者進行底層的修改
外設寄存器欄可以檢視幾乎所有外設的寄存器的數值⭐
可以對比資料手冊,檢視某個值是什麼含義,進而了解某個數值是不是預期的數
也可以檢視核心級别的寄存器
也可以檢視對應中斷向量的值
⭐進階調試方法
區段函數執行時間
可以檢視區段函數的執行時間
執行時間,将顯示在debug模式下的視窗右下角(注意視窗需要全屏顯示才能看到,否則會自動隐藏)
比如檢視延時函數是否準确
Memory檢視寄存器位址
需要輸入帶待檢視數組或者函數的位址,可以結合watch視窗或者stack視窗進行查找位址
這裡我們選擇一個數組進行檢視
把它的位址移到memory視窗中,可以檢視對應記憶體的資料了。
例如,當一個數組很大(上千個)時,watch視窗無法顯示,就需要用memory檢視所有數值。
檢視中斷執行的時間和次數
可以檢視所有中斷的執行時間/次數
全局變量讀寫時暫停
【注意】與設定斷點是不同,他會停留在讀/寫操作的下一行代碼處。