許多小夥伴在使用新唐Cortex-M系列產品時,經常會忘記對變數進行初始化,比如指標、陣列等,並認為系統會默認幫定義的變數進行初始化。
我們來驗證看看,我們定義兩個變數,一個全域變數u16ADCData0和一個區域變數u16ADCData1。
如下工程所示,在 debug 模式下,地址分配情況:u16ADCData0 指向地址 0x20000068,u16ADCData1 沒有指向地址。
透過列印的日誌資訊來看,u16ADCData0 = 0x0000,u16ADCData1 = 0x40070000。很明顯,局部變數u16ADCData1預設並未清零。
打開 Keil 配置時發現優化等級選擇的是 O3。
我們來了解一下優化等級的差異:
O0:幾乎不進行優化,可以任意設置斷點,任何變數都可以監控,建議在調試階段使用這個等級。
O1:輕度優化,有些程式碼無法設置斷點。
O2:中度優化,Debug 時代碼有時會亂跳。
O3:高度優化,編譯後的程式碼最省空間。
我們把優化等級改成O0再測驗驗證看看情況。
在除錯模式下,地址分配情況:u16ADCData0 指向地址 0x20000068,u16ADCData1 指向地址 0x20000240。
從打印的日誌資訊來看,u16ADCData0 = 0x0000,u16ADCData1 = 0x0000。
綜上驗證結論:
1、在優化等級0時,會為所有變數分配記憶體位址,全域變數和區域變數會自動清零。缺點是佔用較大的程式空間。
2、在進行優化等級3時,會優化掉局部變數,因此不會為其分配記憶體位址,所以無法查詢到記憶體位址。全域變數會自動清零,但局部變數不會自動清零。這樣的設計不利於程式開發與除錯。不過好處是可以減少程式空間的佔用。
3、建議所有變數都建議手動進行賦初值。
參考來源