這樣的code,啟動 ADS optimize (小小的optimze就可以)。動作變得不正確。
....
for(i=0;i <10;i++) {
unsigned short sdata;
if ( i & 0x01 ) {
sdata = *(volatile unsigned short*)0x10000012; // get one buffer
ch = sdata >> 4;
}else{
ch = sdata & 0x0FF;
}
... parse ch and move ch to working queue..
}
....
列出assembly code,發現 loop 中的local variabl sdata,在code的原意是要保留數值到下一個loop count時使用,但是開啟optimize後,sdata會以register r10代替,並且在之後 "parase ch and move ch to working queue" 的code,會把r10拿來用,
也就是說,compiler 認為loop 中的sdata的"有效範圍"只有loop 開頭到 ch = sdata XXXX 那一段。
修改的方法,就是把sdata的宣告提到for loop之外
unsigned short sdata;所以ADS人認為for loop 中的local variable ,scope只有signle loop 而已。
for (i=0;i <10;i++)
{
...
這是陷阱 ? 還是 C 的標準 ?
感謝Titan的說明,原來C的標準本來就是這樣。
2 則留言:
的确标准C就是如此设计
原來是這樣呀,我會好好記住。
謝謝 :)
張貼留言