星期五, 11月 25, 2005

Keil 51 Compiler的memory model and Optimize

Memory Model

Keil C 51的Memory有三種:
Small  :  variable in DATA
Compact: variable in PDATA
Large : variable in XDATA
其中variable的意思是指 宣告在function中的local variable。
雖 然依照一般C的implementation,function的local variable應該要從stack中allocate,但是可能是為了防止Stack過深,超過51的限制(51的stack是在idata)。所以 compiler會自動作function間的dependency checking,採用共用變數的方式,將local variable放在 _DATA_GROUP_。
Compiler的選項:Small,Compact,Large的設置就是決定這個segment存放的記憶體位置。
Small   : variable in  DATA,會將所有local variable放在 DATA,segment name叫_DATA_GROUP.
Compact : variable in PDATA,會將所有local variable放在PDATA,segment name叫_PDATA_GROUP_.
Large : variable in XDATA,會將所有local variable放在XDATA,segment name叫_XDATA_GROUP_.

PDATA,XDATA都在外部,但是PDATA是在位址256以內,所以使用R0/R1 就可以index到,不需要用DPTR。
但是PDATA的size也被限制在256。
複習一下51的memory architeture,51內部有記憶體,但是也可以外加記憶體,使用外加的記憶體時,同時可以使用內不的記憶體。
用兩個不同的指令來區分對內部和外的memory動作:
MOV  : 對內
MOVX : 對外
對外的操作一定要用間接定址,index register可以用dptr或是R0/1。
對 內的操作,因為受到51是8bit cpu的影響,一個instruction只有8 bit,所以只能直接address到1/2 byte的位址空間(128 byte),在128 byte以內,可以用直接和間接定址,128到256之間一定要用間接定址。
其他的問題:Keil採用Compiler決定 function depenency,使用function pointer時怎麼辦?

Optimize Level


51 雖然有一般用途的stack和stack pointer,但是Keil C51並沒有真的像標準的C compiler一樣,將function local variable 放在stack中,反而是將local variable都自行allocate在RAM中固定位置,另外利用Compiler作function dependency tree。決定function間共用variable的時機。
這要enable optimize : 2 - Data Overlaying,才會啟動。否則Keil C不會check function dependency而共用local variable。

所以enable optimize 2以上,對RAM用量影響很大。

另 外一個影響RAM用量的optimize的level是 4 : register variable。會在容許的時候,使用register作為local variable。這樣也可以節省ram的使用。但是register 的local variable在debug時無法顯示出來。必須要自己去找出register才行。

沒有留言:

網誌存檔