沒錯,遇到了這個問題 ><
Google爬文
http://www.haifeng.idv.tw/leo/cgi-bin/printpage.cgi?forum=56&topic=485
『 WARNING L13: RECURSIVE CALL TO SEGMENT 』
根據作者 :: walltsou 所說的
應該就是遞迴會有資料溢位的問題,畢竟51的資源有限,所以才會POP出這個警告 !!
"使用C51其實要小心,因為8051資源是很少的。
使用recursive,程式有返回位址要存,而且每次呼叫的參數及區域變數也要存。
參數及區域變數可以使用xdata,問題是返回位址要怎麼辦,8051的SP暫存器只有一個Byte,呼叫一百次大概就滿了。
雖然可以利用Large reenterant將返回位址搬到xdata,但效率會很差,記憶體吃得更快。
故在8051沒有人敢用resursive,因為風險太高,出了問題很難除錯。
建議將resursive展開用for來做,這兩者可以轉換的,而且for的資源可以推出來,在8051才是合理的程式。
Recursive為程式呼叫自己的行為。
Func_A(){ .......; Func_A(); ..........};
另一種是多組函式呼叫但成循環。以二個為例。
Func_B(){ ..... ; Func_C(); .......};
Func_C(){ ..... ; Func_B(); ...... };
這個在編譯時就會發現,不用等到執行。在8051上執行會吃大量記憶體,造成Stack不足。如果不是故意這樣寫,那就表示你的程式有邏輯問題。簡單的說:架構太差。
還有另一種可能:使用function pointer。
使用function pointer時keil C51是無法有效判定,只是pointer設定上有名稱的循環它也會判定出這個Warning。不過有時會有問題,但有時不會。"
沒有留言:
張貼留言