1、前言
在嵌入式項目中,我們經(jīng)常會碰到各種各樣的異常和故障,比如客戶說,某個問題可能需要一天,一周,甚至以月為周期才能復現(xiàn)一次問題。諸如此類問題,著實令工程師苦惱,因為很難去捕獲信息來分析和復現(xiàn)問題,這里給大家分享一些我的經(jīng)驗和技巧。
2、方法
我們都知道調(diào)試是非常高效的分析手段,相信大家對斷點(breakpoint)并不陌生,事實上,斷點還可以設(shè)置條件的,當條件滿足時再觸發(fā)斷點,這對于分析疑難雜癥非常有用。接下來我將介紹如何在 STM32CubeIDE 中使用條件斷點,以及如何使用觀察點。
2.1. 斷點/breakpoint
斷點就是當程序到達某個點時,斷點可使程序暫停運行。我們在調(diào)試界面先設(shè)置一個斷點,鼠標右擊該斷點進入斷點的屬性界面。
為了演示,我在斷點的屬性界面中,為斷點增加了一則條件:(*(int *) 0x42020414 ==0x01)&&(hspi1.Init.NSSPMode == 0x40000000)。此處的“0x42020414”就是 GPIOB 的 ODR 寄存器的地址, “0x40000000”就是“SPI_NSS_PULSE_ENABLE”的宏定義,所以該條件的含義是:當 PB0 輸出高電平時,并且SPI1 的 NSSPMode=SPI_NSS_PULSE_ENABLE 時,觸發(fā)該斷點。
2.2. 觀察點/watchpoint
與條件斷點稍微不同,觀察點也是一種特殊的斷點,當表達式的值發(fā)生變化時,它會使程序暫停運行。那么如何設(shè)置觀察點呢?
還是在調(diào)試界面,首先我們在 outline 界面,或者將變量添加到Variables/Expression/LiveExpression 界面,然后找到該變量,右擊選擇“ToggleWatchpoint”。
在之后出現(xiàn)的界面中,設(shè)置觀察點的屬性。為了演示,我這里設(shè)置了這樣的條件:當ret 變量被寫入的時候,并且 ret 的值不等于 2 的時候,觀察點生效,如下圖所示。大家還可以根據(jù)需要,勾選上“Read”選項,就可以設(shè)置變量在被讀的時候是否生效,非常的方便實用。
3、小結(jié)
這些方法在調(diào)試疑難雜癥時是非常有用的,但是弊端在于,必須連接仿真器進入調(diào)試模式。
在 Cortex-M3 以及更高級的內(nèi)核(如 M4,M33,M7 等)中,對于不連接調(diào)試器的場景,我們還可以利用 SWV,以及 DWT 等調(diào)試單元來提前預埋監(jiān)控程序,實現(xiàn)對內(nèi)存/變量,以及函數(shù)的監(jiān)控和調(diào)試。如“LAT1256 使用 STM32 的 DWT 單元監(jiān)控內(nèi)存”提供了類似的調(diào)試方法的說明。
同樣,我們還可以通過 STM32CubeMonitor 來實現(xiàn)非侵入式的監(jiān)控。對于疑難雜癥,我們的方法是非常多的,大家可以選擇合適的方式來分析問題。