1. 引言
? ? ? ? 在做項目時,百分之三十的時間寫代碼,還有百分之70的時間用于調試。本期將以Keil為例進行調試章節的講解,目的在于做出一個標準化的調試步驟,方便大家學習如何調試代碼。內容分為基礎調試、中級調試及進階調試三部分,本次主要講解基礎調試。
2. 基礎調試
2.1 調試設置
? ? ? ? 在Keil中,我們通常通過下載調試器進行調試。常見的下載調試器有DAP/Stlink等,本次講解以Stlink為例。首先,需要點擊魔術棒進行設置,點擊魔術棒,再點擊DeBug--點擊紅框中的Use,選擇Stlink Debugger,同時將其勾選;如下圖所示:
? ? ? ? 接下來點擊Utilities--取消勾選use debug driver,如下圖所示:
? ? ? ? 選擇Stlink Debugger,如下圖所示,最后點擊確定。
2.2 調試界面講解
? ? ? ? 點擊Keil工具欄的 “d”符號進入調試界面(前提是Stlink已經連接板子),如下圖所示:
? ? ? ? 進入后調試界面如下圖所示:
? ? ? ? 接下來介紹一下debug工具欄,如下圖所示:
復位:其功能等同于硬件上按復位按鈕。相當于實現了一次硬復位。按下該按鈕之后,代 碼會重新從頭開始執行。
執行到斷點處:該按鈕用來快速執行到斷點處,有時候你并不需要觀看每步是怎么執行的, 而是想快速的執行到程序的某個地方看結果,這個按鈕就可以實現這樣的功能,前提是你在查 看的地方設置了斷點。
停止運行:此按鈕在程序一直執行的時候會變為有效,通過按該按鈕,就可以使程序停止 下來,進入到單步調試狀態。
執行進去:該按鈕用來實現執行到某個函數里面去的功能,也就是進入函數中去執行每一行語句,這個過程會讓你看到。
執行過去:在碰到有函數的地方,通過該按鈕就可以單步執行過這個函數,而不進入這個 函數單步執行。
執行出去:該按鈕是在進入了函數單步調試的時候,有時候你可能不必再執行該函數的剩 余部分了,通過該按鈕就直接一步執行完函數余下的部分,并跳出函數,回到函數被調用的位 置。
執行到光標處:該按鈕可以迅速的使程序運行到光標處,其實是挺像執行到斷點處按鈕功 能,但是兩者是有區別的,斷點可以有多個,但是光標所在處只有一個。
匯編窗口:通過該按鈕,就可以查看匯編代碼,這對分析程序很有用。
堆棧局部變量窗口:通過該按鈕,顯示Call Stack+Locals窗口,顯示當前函數的局部變量 及其值,方便查看。
觀察窗口:MDK5提供2個觀察窗口(下拉選擇),該按鈕按下,會彈出一個顯示變量的窗 口,輸入你所想要觀察的變量/表達式,即可查看其值,是很常用的一個調試窗口。
內存查看窗口:MDK5提供4個內存查看窗口(下拉選擇),該按鈕按下,會彈出一個內存查看窗口,可以在里面輸入你要查看的內存地址,然后觀察這一片內存的變化情況。是很常用 的一個調試窗口 串口打印窗口:MDK5提供4個串口打印窗口(下拉選擇),該按鈕按下,會彈出一個類似 串口調試助手界面的窗口,用來顯示從串口打印出來的內容。
邏輯分析窗口:該圖標下面有3個選項(下拉選擇),我們一般用第一個,也就是邏輯分析 窗口(Logic Analyzer),點擊即可調出該窗口,通過SETUP按鈕新建一些IO口,就可以觀察這 些IO口的電平變化情況,以多種形式顯示出來,比較直觀。
系統查看窗口:該按鈕可以提供各種外設寄存器的查看窗口(通過下拉選擇),選擇對應外設,即可調出該外設的相關寄存器表,并顯示這些寄存器的值,方便查看設置的是否正確。
2.3 基礎調試步驟
? ? ? ? 該調試步驟是筆者個人總結的,僅供參考。首先點擊調試,進入調試界面后,此時程序會執行到main函數處,這是因為我們勾選了run to main。
????????先點擊單步調試,點擊執行進去或者是點擊執行過去,通常點擊執行過去可加快調試速度。目的是檢查main函數中的各個硬件初始化函數是否正常運行,看有沒有卡在哪個初始化函數無法繼續往下執行。注意:通常在第一步出現程序卡住的問題大概率是硬件初始化函數的順序不對,比如說在lcd初始化函數里邊調用了串口的printf函數,但是串口初始化函數在lcd初始化函數后邊調用,這個時候就會出現程序卡住的情況。
? ? ? ? 如果需要快速執行到某個地方,可以添加斷點,再點擊執行到斷點處即可。也可以選擇不添加斷點,直接點擊執行到斷點處,此時程序會全速運行,此時你看通過stlink連接的板子顯示的現象是否與你預期的一致,如果不一致或者是沒現象,代表程序卡住了。此時,點擊停止,程序會自動定位到代碼卡住的地方,方便快速糾錯。
2.4 持續更新中....
ps:如有需要MCU+RTOS項目的同學,請聯系1840813505@qq.com,備注CSDN。