在MPLAB IDE下有一個可以觀察變數的視窗"watch"
一般來說所有的變數都可以在此視窗下被看見,除了Reserved Memory 或是 Local Variable:
解決 Reserved Memory 的問題是在 MPLAB IDE 下有個 "Release & Debug" 的下拉視窗 :
如果要用 ICD2 or Real ICE Degubbing 的話,該選項就要選擇 "Debug" 後重新 Build All 再燒錄,
這樣 Linker 才可以將除錯要用到的資源保留下來這樣才不會跟你的程式衝突(共用RAM的問題)。如果
要讓 Target Board 單獨執行的話就可以勾選 "Release" 的選項。
Out of Scope : 是要觀察 Local Variable 時,卻不在此 Local Variable 所宣告的函數內。因為
Local Variable 有可能是用堆疊區的 RAM 來做的,當離開此函數後堆疊指標(FSR1 & FSR2) 也跟
個改變所以就無法得知 Local Variable 的位址,所以就會秀 Out of Scope,只要將斷點設在函數
內就可以看到Local Variable 的值了。
以上從http://www.microchip.com.tw/modules/newbb/viewtopic.php?topic_id=4550&forum=7&post_id=17406#forumpost17406截錄
=====================================================================================================================
不過在C30中卻有一個蠻有趣的現象,在下列程式中,i和j 居然無法在watch被看見(出現Out of Scope 或 Symbol Not Found)但 之前的判斷式執行無誤
void main(){
int i,j; //watch中,看不見喔
i=2;
j=i+10;
if(i>j) //判斷OK
TMR2=i*j;
else
TMR2=j/i;
:
:
while(1){
:
: //這當中無再使用有關i ,j這兩個變數
}
}
若是修改程式,讓i與j在while loop中有被操作,這時i和j就現形了
while(1){
:
i++;
if(i>123){
:
}
j+=i;
if(j<456){
:
}
}
這種情形其實是C30在作怪,怎麼說呢?
在project的build options中"MPLAB C30"裡有一個Optimization的選項,
在當中有幾個Optimization level可以選擇,當調高Optimization level時
C30就會把一些毫無意義的程式給修改掉例如上面的程式 i,j都僅是一個常數
所以 if(i>j)的結果是唯一的,C30就把這段code改成,
void main(){
TMR2=6;
:
:
while(1){
:
: //這當中無再使用有關i ,j這兩個變數
}
}
這樣不僅有效率,且也省了兩個變數,進而達到Optimize,
不過有時調低Optimization level,依然會有Out of Scope的情況,
這個我就不知要如何弄了,不過可以確定的是該Out of Scope的變數一定是個拖油瓶,
要嘛視而不見,若非要看到它就宣告成GLOBLE Variable吧
ps:c32好像沒有此現象,Hi-tech C就不知囉,改天再試!!
===========================================================
在C32中Optimize的效果更厲害,i,j既使宣告成globle一樣看不到(不過能看到該變數在watch中,亦有位址,但值為0)
這時候就要宣告成volatile的型態,這樣就讓他現出原形囉