會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客





詢問各位前輩關於C語言副程式內的自動變數
高級會員
註冊日期:
2014/12/02 11:55
所屬群組:
註冊會員
文章: 82
等級: 8; EXP: 0
HP : 0 / 175
MP : 27 / 1481
離線
最近發現一個問題,請有經驗的前輩幫解惑

同時有使用X-IDE和IAR
最近寫IAR程式的時候發生了個問題

在副程式 aProgram()內有"區域變數" UINT16 addr16;
在進入bProgram()之後再跳回aProgram()的時候,addr16這個區域變數的值無故的被改變了,在debug模式下發現,addr16被分配在R6暫存器內,並沒有將addr16這個值分配在某個ram的位置

後來將UINT16 addr16; 改為volatile UINT16 addr16;
addr16就被分配到某個ram的位置去,然後addr16就沒有無故被改變,問題就解決了

請問在副程式內的區域變數也要宣告成volatile比較安全嗎?
還是我原本的做法在觀念上原本就不對了呢...

額外問一下,若原本在a副程式內有區域變數,但是在a副程式做到一半的時候會跳進b副程式去做事,那a副程式內的區域變數是否也是應該宣告成volatile比較好,避免編譯器優化後出了我上述的問題

2月08日 14:43:51
轉換PDF檔 列印


Re: 詢問各位前輩關於C語言副程式內的自動變數
高級會員
註冊日期:
2008/04/13 16:02
所屬群組:
註冊會員
文章: 96
等級: 8; EXP: 78
HP : 0 / 194
MP : 32 / 5422
離線
描述裡看起來,長得是像這樣?


Main
()
{
    
aProgram();
    
bProgram();
    
aProgram();
}  

aProgram()
{
    
UINT16 addr16;
}  

bProgram()
{  
}


區域變數在return之後,並不會有專屬的空間來存放,有可能值一樣,也有可能被改掉,值是什麼和編譯器與人品有關...

問題最後面提到的在aProgram中叫bProgram,當呼叫副程式時,原本的變數會被推到stack裡,,回到aProgram時再pop出來用,所以原本的值會被保留

標準的C可以在副程式裡宣告static變數,印象中PIC的是不行...,所以應該是沒辦法在執行完後保留某個區域變數的值

2月08日 16:56:08
轉換PDF檔 列印


Re: 詢問各位前輩關於C語言副程式內的自動變數
高級會員
註冊日期:
2014/12/02 11:55
所屬群組:
註冊會員
文章: 82
等級: 8; EXP: 0
HP : 0 / 175
MP : 27 / 1481
離線
我應該打上code更為清楚一點


aProgram
()
{
EA = 0;

UINT16 addr16;

addr16 = (array[1] << 8) | array[0];

code1;
code2;
code3;
bProgram();
code4;
code5;
code6;

EA = 1;
}

bProgram()
{

}


debug時發現,在code3這行的時候,跳進bProgram()之前,addr16的值都還是正常的,從bProgram跳出來後值就被改掉了,在debug模式下發現addr16被放在R6暫存器,在猜想是否可能在bProgram()內,也使用了R6暫存器在處理事情,所以導致跳出bProgram()的時候addr16的值才被改變了

註:在進入aProgram的時後就關閉所有中斷

所以想詢問的是,若碰到上述這種狀況,aProgram()內的區域變數是否都要以volatile來宣告較為保險,避免變數被放進硬體暫存器內,而不是放在ram內存取

2月09日 08:25:59
轉換PDF檔 列印






無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
線上教學影片
網頁捷徑
2017 Summer Elite 報名
教育訓練
其它網站連結
電話: 02-25000405
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project