51單片機局部變量占用ram的問題
一、問題
自從工作以來基本不使用51或者增強型51之類的單片機。最近調試芯聖HC89S003F4增強型51,移植了32的實用代碼,結果發現RAM爆了!!!

二、實踐
為了看出問題,我又重新建立了一個簡單工程。
#include <reg52.h>
int test(void)
{
char a[20];
return 1;
}
void main(void)
{
test();
while(1);
}
結果a改多大,RAM就加多少。
再看STARTUP.A51文件,發現跟stm32的啟動程序不一樣,根本沒有定義heap堆,stack也是追加在被使用RAM的末尾。
最后看了這個帖子
http://bbs.21ic.com/icview-281857-1-1.html
基本可以確定是局部變量沒有地方保存,全存RAM里了!!
但是這樣不合理啊,豈不是寫個函數就占一部分RAM,不用幾十個函數,RAM就不夠用了。於是我開始看編譯生成的匯編。
- 右鍵
main.c打開Options配置窗口,勾選SRC

- 編譯后會在
Project\Objects生成main.SRC文件



- 幾番調試后,發現局部變量、傳參會隨緣用到R3R7,指針傳參會用到R1R3;傳參大於2個的或者使用long類型字節存RAM;
三、結論
51局部變量不存堆,存R0~R7,可能跟八位機容量小、尋址比較慢有關。
反正使用的時候注意傳入參數需要小於三個,像va_list之類的占用大的局部變量盡量不要使用,以免空間不夠用。
