天天看點

stm32 MDK debug調試方法使用仿真器進行線上調試

MDK debug調試方法

  • 使用仿真器進行線上調試
    • ⭐基礎調試方法
      • 調試環境的配置
      • 調試界面介紹
        • 執行操縱欄
        • 斷點
        • 挂起
      • 調試視窗介紹
        • call stack windows
        • watch windows
        • peripheral工具欄
    • ⭐進階調試方法
      • 區段函數執行時間
      • Memory檢視寄存器位址
      • 檢視中斷執行的時間和次數
      • 全局變量讀寫時暫停

使用仿真器進行線上調試

硬體環境:STM32F407VET6核心闆

軟體環境:Keil 5.0

分類:此類為【技巧型】知識,需要多加練習才能掌握

你可以學到:如何通過MDK的自帶的調試功能進行調試與檢查可能出現的問題

⭐基礎調試方法

調試環境的配置

  1. 配置好debug:點選魔術棒
    stm32 MDK debug調試方法使用仿真器進行線上調試
    在Debug-setting選項中進行如下配置:
stm32 MDK debug調試方法使用仿真器進行線上調試

左側和仿真器型号相關,右側和單片機型号相關。

如果出現:

左邊檢測不到,是因為沒有連結電腦

右邊檢測不到,是因為沒有連接配接開發闆

如果:

兩側都有顯示,說明可以進行下載下傳和調試,進入下一步調試階段。

  1. 點選放大鏡即可進入
    stm32 MDK debug調試方法使用仿真器進行線上調試

調試界面介紹

執行操縱欄

stm32 MDK debug調試方法使用仿真器進行線上調試

分别是複位/程式運作/停止

複位:程式重頭開始執行,(可以和斷點進行配合使用)

Run:使程式正常進行

挂起:停止正在運作的程式

進入函數/執行過此函數/跳出函數/執行到光标處

這些按鈕可以控制函數的執行流程,用以動态的檢視函數的工作和運作

斷點

stm32 MDK debug調試方法使用仿真器進行線上調試

隻有在灰色區域可以設定斷點

上圖中,【黃色箭頭】是程式執行到的地方/【綠色箭頭】是光标所在地方

可以設定斷點狀态:

stm32 MDK debug調試方法使用仿真器進行線上調試

插入斷點、使能/失能斷點、失能所有斷點、清楚所有斷點。

這些選項可以對斷點進行管理,友善使用斷點。

【注意】點選 run 是執行到斷點處,(此時斷點所在的行【沒有】被執行),斷點是:即将執行某一行代碼。

除了設定斷點之外,還可以設定挂起:

挂起

挂起:程式執行到某個地方突然被中斷

與斷點的差別:挂起并不知道在哪裡停下,知識知道在發生什麼事件後停下,這個事件可以通過外部的标志進行判斷

調試視窗介紹

stm32 MDK debug調試方法使用仿真器進行線上調試

先介紹比較常用的幾個視窗

call stack windows

stm32 MDK debug調試方法使用仿真器進行線上調試

顯示正在執行的程式中,函數的調用情況

點開後,是下列界面:

stm32 MDK debug調試方法使用仿真器進行線上調試

第一列是函數名稱/第二列是函數位址或者函數值(傳回值)第三列是函數類型

同時可以檢視函數内部的局部變臉。

使用的時候,不需要将函數拖進去,就可以檢視函數内部局部變量的值。

這裡思考一個問題:為什麼函數中的局部變量的值要在堆棧裡檢視?
猜測:因為C語言中調用函數内部的局部變量,是在調用時生成,調用結束後銷毀的,
用堆棧存放這些變量,可能是考慮到了函數的嵌套調用的情況,
在函數調用完畢後,最後一個被存儲的局部變量第一個被銷毀。剛好符合堆棧後進先出的原則。
           

watch windows

stm32 MDK debug調試方法使用仿真器進行線上調試

直接将某個函數或者變量拖進來,就可以顯示該函數或者變量的值。

如下圖所示:

stm32 MDK debug調試方法使用仿真器進行線上調試

這樣可以很友善的在調試過程中檢視寄存器或者變量的情況。(函數對應的是函數入口位址)

需要特别注意MDK的優化問題

一定要使用level-0優化方式,否則優化登記太高,将不會顯示某些變量的值,導緻一些變量一直處于< not in scope>的狀态

優化的選項在魔術棒中,如下圖

stm32 MDK debug調試方法使用仿真器進行線上調試

peripheral工具欄

stm32 MDK debug調試方法使用仿真器進行線上調試

在這個工具欄下,幾乎可以選擇所有的片内外設,點開後,會顯示外設的寄存器的所有狀态

我們依照這些寄存器狀态,去和資料手冊進行比對,進而可以找出問題或者進行底層的修改

stm32 MDK debug調試方法使用仿真器進行線上調試

外設寄存器欄可以檢視幾乎所有外設的寄存器的數值⭐

可以對比資料手冊,檢視某個值是什麼含義,進而了解某個數值是不是預期的數

也可以檢視核心級别的寄存器

也可以檢視對應中斷向量的值

⭐進階調試方法

區段函數執行時間

stm32 MDK debug調試方法使用仿真器進行線上調試

可以檢視區段函數的執行時間

執行時間,将顯示在debug模式下的視窗右下角(注意視窗需要全屏顯示才能看到,否則會自動隐藏)

比如檢視延時函數是否準确

Memory檢視寄存器位址

stm32 MDK debug調試方法使用仿真器進行線上調試

需要輸入帶待檢視數組或者函數的位址,可以結合watch視窗或者stack視窗進行查找位址

這裡我們選擇一個數組進行檢視

stm32 MDK debug調試方法使用仿真器進行線上調試

把它的位址移到memory視窗中,可以檢視對應記憶體的資料了。

stm32 MDK debug調試方法使用仿真器進行線上調試

例如,當一個數組很大(上千個)時,watch視窗無法顯示,就需要用memory檢視所有數值。

檢視中斷執行的時間和次數

stm32 MDK debug調試方法使用仿真器進行線上調試

可以檢視所有中斷的執行時間/次數

stm32 MDK debug調試方法使用仿真器進行線上調試

全局變量讀寫時暫停

stm32 MDK debug調試方法使用仿真器進行線上調試

【注意】與設定斷點是不同,他會停留在讀/寫操作的下一行代碼處。