仿真調試的作用
1.仿真調試實時跟蹤代碼的運行,逐步執行代碼,程序出現問題並能跟蹤到問題所在;
2.設置調試斷掉,使程序運行到指定位置停下;
3.能夠觀察全局變量的變化、寄存器的變化;
4.可以查詢某個內存地址的存儲的數據;
5.顯示調用棧的內容,也就是函數指針和局部變量;
6.可以查詢片內外設和片外外設的寄存器變化,對照芯片手冊的相應寄存器的說明,便可以知道相應外設寄存器的值是否出錯。
調試界面常用按鈕
以上為調試界面常用的按鈕
以上為查看片內外設寄存器的操作,結合芯片手冊相應寄存器的說明,便可以明白相應外設寄存器的值是否符合預期。
編譯優化
以上為將編譯器設置為-O2優化的方法,編譯器想盡辦法去壓縮程序存儲空間,提高運行速度。一般編譯器,優化有多個等級:-O0、-O1、-O2、-O3:
-O0:默認優化級別,不壓縮程序存儲空間,不提高程序運行速度,保證程序的可靠執行;
-O1:輕度優化,輕度壓縮程序存儲空間,輕度優化程序運行速度;
-O2:推薦優化等級,在程序存儲空間和程序運行速度取得平衡點;
-O3:最高級別的優化等級,有可能導致程序不能運行,也會使用以空間換時間的方法,導致程序體積增大。
-O0:
-O2
以上為不優化和使用-O2優化編譯同一工程所產生的結果,可以看出使用-O2將輸出的可執行文件減小了10%,這還是很可觀的,所以能優化的時候盡量使用優化。
volatile關鍵字
注意如果使用了-O2優化有些變量的定義就需要volatile關鍵字修飾,CPU去訪問被volatile修飾的變量時會小心翼翼去去實際所在的內存地址中去讀取它的值,而不是去讀取保存在寄存器中的備份, volatile往往應用在三種場合:
1.多線程編程共享全局變量的時候,該全局變量要加上volatile進行修飾;
2.裸機編程的時候,某函數與中斷服務函數共享全局變量的時候,該全局變量要加上volatile進行修飾,讓編譯器不要省略該變量的訪問;
3.CPU訪問外設寄存器的時候,寄存器是指向一個地址,需要加上volatile進行修飾,表示讓CPU去該地址讀取值,而不是使用備份的值。
總結
1.調試時如果要查看局部變量的值就不應使用優化,不然不能夠在Call Stack窗口中查看但局部變量的值;
2.watch窗口只能跟蹤全局變量的值;
3.延遲函數的計數值在使用-O2優化時,需要使用volatile修飾,不然會被優化而不能延遲。