踩坑編譯器優化問題

2021-10-06 02:55:05 字數 596 閱讀 4438

故事背景:

最近在除錯自己畫的板子時,又再次遇到了變數被編譯器優化的問題。雖然不是第一次遇到這個問題了,但還是花了一些時間才定位到這個點。為了警醒自己,避免再在這個問題上浪費時間,特記錄下來。

問題描述:

除錯**時,發現rxflag(串列埠接收資料完成標誌)被置起時,無法進入 if 條件語句。

問題分析:

如下圖,在debug模式下,從生成的彙編**中可以看到,程式只對rxflag執行了一次判斷,然後就一直在0x080020e6這裡了,不會再跳轉到0x080020d2去取rxflag的值做判斷了。這樣問題已經很明顯了,可能是編譯器優化了變數,並不是每次都從變數的源頭去取值。所以,rxflag變數前應加volatile關鍵字修飾。

問題解決:

在變數前加關鍵字 volatile。從下圖可以看出,程式都是跳轉到0x080020d6,從rxflag源頭取值。所以加關鍵字volatile可以解決這個問題。

編譯器優化問題

今天遇一程式,unsigned char a,b,c a 0x89 b a 1 c a b 在單步除錯的時候,觀察數值發現b的值為0,分析b的值應當為0x44,百思不得其解,通過檢視其彙編語句,發現問題所在。彙編語句如下 mov r7,tmod 0x89 mov a,r7 clr c rrc a a...

編譯器優化

常量摺疊 a 1 2 由於結果可預見,編譯器直接生成a 3 常量傳播a 1 若後續 沒有更改a,則編譯器將a直接用其值1代替 減少變數 對於x和y的比較,可以轉換成if i j x i2 y j 2 if x y 複寫傳播 類似於常量長傳,不過傳播的是變數 若後續 未修改a的值,則編譯器用m代替a ...

編譯器優化 乘法優化

由這個想到的 31乘以某個數能不能寫成這個數乘以2的次冪 再減去這個數。用數學語言表達一下就是 設這個數為x 31 x x 2 n x 這個等式是否存在,如果存在,求n的值 那我們計算一下,31 2 n 1 得2 n 32 得n 5 也就是說存在那麼乙個n使得,31乘以某個數的結果等於這個數乘以2的...