51單片機局部變量占用ram的問題


51單片機局部變量占用ram的問題

一、問題

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

image

二、實踐

為了看出問題,我又重新建立了一個簡單工程。

#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

image

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

image

image

image

  • 幾番調試后,發現局部變量、傳參會隨緣用到R3R7,指針傳參會用到R1R3;傳參大於2個的或者使用long類型字節存RAM;

三、結論

51局部變量不存堆,存R0~R7,可能跟八位機容量小、尋址比較慢有關。

反正使用的時候注意傳入參數需要小於三個,像va_list之類的占用大的局部變量盡量不要使用,以免空間不夠用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM