2.08.2007

ADS 的optimize local var in loop


....
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..
}
....
這樣的code,啟動 ADS optimize (小小的optimze就可以)。動作變得不正確。

列出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;
for (i=0;i <10;i++)
{
...
所以ADS人認為for loop 中的local variable ,scope只有signle loop 而已。
這是陷阱 ? 還是 C 的標準 ?
感謝Titan的說明,原來C的標準本來就是這樣。

2 則留言:

Titan.Song 提到...

的确标准C就是如此设计

checko 提到...

原來是這樣呀,我會好好記住。
謝謝 :)