1、 文檔目標
本文旨在為使用Keil MDK(Microcontroller Development Kit)進行嵌入式開發(fā)的工程師提供一種詳細的指導(dǎo)方法,幫助其在調(diào)試過程中確認當前程序運行狀態(tài)下的函數(shù)調(diào)用鏈和局部變量信息。特別是在實時操作系統(tǒng)(RTOS)環(huán)境下,開發(fā)者需要明確當前任務(wù)的執(zhí)行上下文以及堆棧中的變量分布情況,以快速定位問題并優(yōu)化代碼。
通過本文所述的方法,開發(fā)者可以更高效地利用MDK調(diào)試工具的功能,提升調(diào)試效率,減少因堆棧溢出或函數(shù)調(diào)用異常導(dǎo)致的系統(tǒng)崩潰風險。
2、 問題場景
在嵌入式開發(fā)中,復(fù)雜的應(yīng)用程序通常包含多個函數(shù)調(diào)用層級,尤其是在引入實時操作系統(tǒng)(如RTX RTOS)后,任務(wù)切換和多線程機制使得程序執(zhí)行流程更加復(fù)雜。傳統(tǒng)的單步調(diào)試方式雖然能夠逐步跟蹤代碼執(zhí)行,但難以直觀地展示當前任務(wù)的函數(shù)調(diào)用關(guān)系以及局部變量的狀態(tài)。
例如,當程序運行到某一點時,開發(fā)者可能需要確認以下信息:
● 當前任務(wù)的函數(shù)調(diào)用鏈是什么?
● 哪些局部變量已被加載到堆棧中?
● 局部變量的值是否符合預(yù)期?
這些問題在調(diào)試過程中尤為關(guān)鍵,因為它們直接關(guān)系到程序的正確性和性能優(yōu)化。然而,手動分析堆棧信息不僅耗時,還容易出錯。因此,如何利用Keil MDK提供的工具快速獲取這些信息成為亟待解決的問題。
3、軟硬件環(huán)境
1)、軟件版本:Keil MDK 5.38a
2)、電腦環(huán)境:Windows 11
3)、外設(shè)硬件:無
4、解決方法
1)、在MDK Debug模式下,有一個Call Stack + Locals窗口,該窗口就是用于顯示當前位于堆棧上的對象。對于使用RTX-RTOS的應(yīng)用程序,會顯示任務(wù)。每個對象都與其位置或值以及類型相關(guān)聯(lián)。當前函數(shù)位于列表頂部,被調(diào)用函數(shù)位于其下方,并且還會顯示當前函數(shù)的所有局部變量的信息。(如圖4-1)

圖4-1
2)、Call Stack + Locals窗口可以通過菜單欄View->Call Stack WIndows打開(如圖4-2-1)或者直接在工具欄中點擊Call Stack Windows的按鈕打開(如圖4-2-2)。

圖4-2-1

圖4-2-2
3)、在程序運行過程中Call Stack + Locals窗口是不會進行更新的,只有觸發(fā)斷點或者程序暫停運行后,才會顯示出當前情況下處于堆棧中的函數(shù)與對象。(如圖4-3)

圖4-3
4)、在Call Stack + Locals窗口中一共包含以下的三欄數(shù)據(jù)(如圖4-4):
(1)、Name:顯示符號名稱。當前活動的功能或任務(wù)以綠色突出顯示。
(2)、Location/Value:顯示該項的內(nèi)存地址或值,或具有解釋性文本。對于unsigned char類型的項,該字段顯示值和字符。
(3)、Type:顯示對象類型。函數(shù)與其返回類型和參數(shù)類型相關(guān)聯(lián)。

圖4-4
5)、還在通過右鍵選中對應(yīng)的函數(shù)或者變量,跳轉(zhuǎn)到對應(yīng)函數(shù)的位置或者被調(diào)用的位置。(如圖4-5)

圖4-5