一、單片機的存儲資源(以MKL25Z4為例)
如下圖所示,FLASH的大小是128kbyte,RAM的大小是16kbyte。該單片機FLASH的起始地址時從0開始的,如果改變FLASH的起始地址,可利用的資源會更少,比如下圖中我設置的起始地址時從0x5000開始的,那么可利用的FLASH大小就為(0x20000-0x5000)byte;總結來說就是起始地址和結束地址共同決定了當前可利用的存儲資源,而總的存儲資源是由單片機本身決定的也是不可變的。
二、FLASH和RAM存儲器中存放的數據類型
如下圖所示,FLASH包含.data段、.text段和其它;RAM包含.data段、.bss段和其它,其中還有我們熟悉的.heap和.stack它們的存在會占用RAM的存儲資源。
1、.bss段(Block Started by Symbol)
BSS段通常是指用來存放程序中未初始化的或者初始化為0的全局變量和靜態變量的一塊內存區域。特點是可讀寫的,在程序執行之前BSS段會自動清0。特點是可讀寫的,在程序執行之前BSS段會自動清0。
2、.data段(data segment)
數據段通常是指用來存放程序中已初始化的全局變量的一塊內存區域。數據段屬於靜態內存分配。
3、.text段(code segment/text segment)
代碼段通常是指用來存放程序執行代碼的一塊內存區域。這部分區域的大小在程序運行前就已經確定,並且內存區域通常屬於只讀,在代碼段中也可能包含一些只讀的常數變量。
三、代碼演示
下面通過寫一些簡單的代碼來觀察常用類型的變量存放方式:
總結:從以上可以看出賦初值(初值≠0)的全局變量存在RAM的.data段中(雖然上圖中指示的Flash區域和RAM區域都含有.data且具有相同的內容,但通過觀察他們的起始地址會發現他們屬於同一個數據);而不賦初值(或者賦初值=0)的全局變量只存在於RAM的.bss段中;靜態局部變量和全局變量一樣。只讀類型的全局變量和靜態局部變量的都存在FLASH的.text段中。
#end