專注電子技術學習與研究
當前位置:單片機教程網(wǎng) >> MCU設計實例 >> 瀏覽文章

單片機MCU內(nèi)存分配

作者:佚名   來源:轉(zhuǎn)自lskybs的空間   點擊數(shù):  更新時間:2014年09月03日   【字體:

 談到內(nèi)存,我們都會想到PC,對于單片機或者arm來說也是存在內(nèi)存的,簡單的理解是:內(nèi)存嘛……就是存放東西的地方,只不過這個東西是數(shù)據(jù)而已,好了,還是把重點放在mcu上面,對于一款mcu來說,在性能描述的時候都會告訴sram,flash的容量大小,對于初學者來說,也不會去考慮和理會這些東西,拿到東西就只用。其實不然,這些量都是十分重要的,仔細想想,代碼為什么可以運行,代碼量是多少,定義的int、short等等類型的變量究竟是怎么分配和存儲的,這些問題都和內(nèi)寸有關系。

   首先單片機的內(nèi)存可以大小分為ram和rom,這里就不再解釋ram和rom的區(qū)別了,我們可以將其等效為flash和sram,其中根據(jù)flash和sram的定義可得,flash里面的數(shù)據(jù)掉電可保存,sram中的并不可以,但是sram的執(zhí)行速度要快于flash,可以將單片機的程序分為code(代碼存儲區(qū))、RO-data(只讀數(shù)據(jù)存儲區(qū))、RW-data(讀寫數(shù)據(jù)存儲區(qū))和ZI-data(零初始化數(shù)據(jù)區(qū))。在MDK編譯器下可以觀察到在代碼中這4個量的值,如下圖1所示:
 
圖1:
 
其中code和RO-data存儲在flash中,所以兩者之和為單片機中flash需要分配給它們的空間大小(并且等于代碼所生成的.bin文件大小),另外RW-data和ZI-data存儲在sram中,同樣兩者之和為單片機中sram需要分配給它們的空間大小。
   另外,我們必然會想到棧區(qū)(stack)、堆區(qū)(heap)、全局區(qū)(靜態(tài)區(qū))(static)、文字常量區(qū)和程序代碼區(qū)和上面所介紹的code、RO-data等的關系。
1、棧區(qū)(stack):由編譯器自動分配釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結構中的棧。 這些值是可讀寫的,那么stack應該被包含在RW-data(讀寫數(shù)據(jù)存儲區(qū)),也就是單片機的sram中。
2、堆區(qū)(heap):一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 ?梢岳斫,這些也是被包含在單片機的sram中的。
3、全局區(qū)(靜態(tài)區(qū))(static):全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域, 未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域,程序結束后由系統(tǒng)釋放。這些數(shù)據(jù)也是可讀可寫的,和stack、heap一樣,被包含在sram中。
4、文字常量區(qū):常量字符串就是放在這里的。這些數(shù)據(jù)是只讀的,分配在RO-data(只讀數(shù)據(jù)存儲區(qū)),則被包含在flash中。
5、程序代碼區(qū):存放函數(shù)體的二進制代碼,可以想象也是被包含在flash,因為對于MCU來說,當其重新上電,代碼還會繼續(xù)運行,并不會消失,所以存儲在flash中。
 
   綜上所述,MCU的內(nèi)存分配基本如此,其中并沒有提到存儲空間所對應的flash和sram地址,這些后面還會講到!如有錯誤,請指正。
關閉窗口