MDK/Keil 中,J-Link調試查看變量值總是顯示

轉載請註明出處,謝謝。

MDK/Keil 中,J-Link調試查看變量值總是顯示<not in scope>

原因:編譯器把代碼優化掉了,直接導致在仿真中變量根本沒有分配內存,也就無法查看變量值

進一步原因分析:想要觀察的變量在代碼中沒有被使用,因此被編譯器自動優化

PS:注意的是,被使用可以理解爲:代碼執行時,需要讀取變量所在內存

PS: 測試截圖已經丟失,實在不好意思。請各位自己嘗試。

例如:

int temp;
int num;
temp=30;
//到此爲止,僅僅是給變量賦值,而不需要讀取temp的內存值,因此編譯器優化掉此變量
num=temp;
//這一步,把temp的值賦值給num,有讀取temp的內存值,但是無讀取num內存值,因此編譯器把此句給優化掉了,導致temp也相當於沒讀取內存值,因此num和temp都被優化掉


使用變量temp後:

int temp;
int num;
temp=30;
//到此爲止,僅僅是給變量賦值,編譯器優化掉此變量
num=temp;
//這一步,把temp的值賦值給num<span style="font-family: Arial, Helvetica, sans-serif;">,有讀取temp的內存值</span>
for(temp=0;temp<10;temp++);
//這一步,在for循環中無論是大小比較(temp<10)還是自加(temp++)都需要讀取temp所在的內存值,因此temp不會被優化,而num由於後續沒有讀取內存值,被優化了


變量temp與num均使用:

int temp;
int num;
temp=30;
//到此爲止,僅僅是給變量賦值,編譯器優化掉此變量
num=temp;
//這一步,把temp的值賦值給num<span style="font-family: Arial, Helvetica, sans-serif;">,有讀取temp的內存值</span>
for(temp1=0;temp1<10;temp1++)
   num++;
//這一步<span style="font-family: Arial, Helvetica, sans-serif;">在for循環中無論是大小比較(temp<10)還是自加(temp++)都需要讀取temp所在的內存值,因此temp不會被優化,而num由於自加(num++)也被使用,也不會被優化</span>


以後調試中遇到這種情況的解決辦法

核心思想是:讓變量值在代碼中被讀取其內存值

1、把變量定義爲全局變量,全局變量編譯器貌似不會太多幹擾,但是在項目中總不能定義太多全局變量,而且經常爲了調試而改代碼,太麻煩了

2、使用變量,讓編譯器不優化掉,例如在for循環中使用。更簡單的方法是把變量定義爲 volatile。
例如:int temp;    =>   volatile int temp;//volatile變量會使得cpu每次使用該值時都一定會從內存讀取而不是直接使用cpu寄存器裏的值,相當於提高了變量的級別,編譯器不會優化此變量

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章