單片機內程序運行的時候ram空間是如何分配的?


轉自:http://blog.sina.com.cn/s/blog_a575eb9401014tam.html

單片機內程序運行的時候ram空間是如何分配的?
我現對一個程序進行減少片內ram的使用的優化,有一些效果,同時也產生了些疑問,在此向各位大蝦請教:
一、現象:
1、    我在通過減少全局變量、函數內變量的使用,減少函數間參數傳遞等手段來優化,發現某些時候我減少一個變量的使用,keil編譯的結果就顯示data減少了一字節,有時候這樣一直減少幾個變量的使用,data值一直都不會變,接着再減少變量的使用,又會一個一個的減少,到后來又不減少了。
2、    我屏蔽程序中一些代碼之后編譯,顯示data反而是增加了。
二、疑問:
1、單片機程序運行的時候,內部ram是如果分配管理的,data值由哪些部分組成?
2、之前描述的兩個現象如何解釋?
3、data值是不包括堆棧空間的,那么程序運行的堆棧空間大概需要多少,和哪些因素有關,能不能預估?
4、單片機片內ram的使用限度是多少?(指keil編譯出來的data值最好不要超過多少)  

 

答:單片機內程序運行的時候ram空間是如何分配的
1、RAM的分配是與你選擇的編譯模式有關,你可以看下編譯器的手冊,再打開最后產生的分配對照表仔細對照源程序,應該可以找到規律。

2、仍然與編譯模式有關,通常全局變量數量的變化可以立即反映在data段的長度上,但如果局部變量是指定用堆棧,就不一定會反映在data段的長度上了。

3、堆棧空間與你的RAM空間的分配有關,這是在連接時確定的,在鏈接描述文件中指定的。

4、RAM的使用限度當然跟你的單片機RAM的大小有關。

對不起,我對Keil的環境不熟,我不能幫你解釋具體到Keil上如何;上面講的是基本原理,每個C語言的環境都是這樣。

 

 

謝謝平常人!若有機會到廣佛一帶,我請你喝酒!
keil編譯模式我選擇的small:variables in data模式,大家一般也都應該是這個模式吧。變量都是定義到data/idata區的。
keil編譯結果和編譯器本身有關,就算是不同的編譯器,在內存分配上是不是有共同遵從的方法呢?
或者您能不能介紹其他某個編譯器的內存分配方式呢?


通常全局變量數量的變化可以立即反映在data段的長度上,但如果局部變量是指定用堆棧,就不一定會反映在data段的長度上了。
re:你的意思是局部變量占用的空間的使用還不一定包含到編譯結果里了?我編譯的結果是200多字節的data,由哪些組成?


ram使用限度跟單片機有關,那好比我的單片機片內ram是256的,那我使用的空間(也就是keil編譯出來的結果)的限度是多少,或者和哪些有關?也就是通常做法,我要留給堆棧多少空間?

另外再問一下:
同一個程序生成的bin文件和hex文件在大小上有什么關系?
聽說bin會是hex的一半?
這兩個文件在使用中有什么區別?

 

 

變量在內存的分配方式
通常單片機的RAM區可以分成3類,短地址區、長地址區和外部地址區。

短地址區一般指00-FF之間可以用8位地址訪問的區域,長地址區一般指0100-FFFF之間必須用多於8位的地址訪問的區域,外部地址區指CPU外部總線訪問的區域,不同的區域有不同的指令尋址方式,例如:
MOV A, 40H ;訪問短地址區
MOV A, @DPTR ;訪問長地址區

一般的51中沒有外部地址區。

根據用途還划分了一個堆棧區。

不同的存儲分配模式決定了全局變量是放在那個區域,訪問短地址區的指令可能比訪問長地址區的指令短且快,但長地址區可容納較多變量,尤其是較大的數組。

局部變量有兩種分配策略,一種是放在堆棧中,因為局部變量只在他所在的函數中有效,出了這個函數退棧就可以清理掉局部變量所占空間,空間可重復利用。這種策略下,減少局部變量的使用並反映不出內存占用量的減少,因為內存的占用是動態的。

另一種策略是分析函數調用關系,把局部變量放在某段特定的內存區,如下例:
func1()
{
CHAR c1, c2;
....
}

func2()
{
CHAR x1, x2, x3;
...
}

main()
{
func1();
func2();
....
}

編譯器發現func1與func2沒有調用關系,就把c1與x1分配到同一個地址,c2與x2分配到同一個地址,x3分配到另一個地址;這樣處理可以比堆棧的方法得到較高的效率。當你減掉c1時,並沒有減少內存的總用量。

所以,堆棧的長度要看你程序的調用關系,局部變量的使用策略等因素,根據實際情況決定。

至於bin與hex文件的區別,我的理解bin是用二進制的形式存放可執行代碼,而hex文件使用ASCII形式存放可執行代碼;如
  0x12, 0x34, 0x56  bin文件
  1 2 3 4 5 6 hex文件

你說他們的大小是什么關系?

對不起,我只能講這么多了,再講就可以寫一本書了。


免責聲明!

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



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