單片機軟件都是以hex或者bin文件的形式燒錄到我們的MCU中進行存儲的,那你知道這些燒錄的文件在MCU中是如何分布的嗎?
舉一個簡單的例子,編譯一個STM32例程的MDK軟件工程,得到輸出信息如下:
接下來詳細看下Program Size的組成部分解析(我們燒錄文件的組成部分):
Code:程序代碼段,主要用于儲存程序代碼。
Ro-data:只讀類型數據段,主要用于存放程序中定義的常量。
RW-data:讀寫類型數據段,主要用于存放被初始化為非0值的全局變量。
ZI-data:讀寫類型數據段,主要用于存放被初始化為0值的全局變量。
看到這里你可能會有點好奇都是讀寫數據類型,為什么要分為RW和ZI兩個部分呢?(思考一下,文章后面會給出答案)。
通常我們所說的MCU的存儲部分主要是片內Flash和片內RAM,這里我可以簡單地把片內忽略掉,那么我們燒錄文件中的四個段內容,哪些需要燒錄到Flash?哪些又要燒錄到RAM中呢?你知道對工程Map一下,在map文件的最后會給出答案。(map的含義就是內存映射,map一下就是查看所有的代碼及數據的內存映射地址),如下:
RO size:包含了Code 和RO data ,是需要存放在MCU的flash空間中。
RW size: 包含了RW 和 ZI data,是需要存放在MCU的RAM空間中。
那么是不是flash中的內容就是RO size ,RAM中的內容就是 RW size呢?
答對了一半,RAM中內容就是RW size。
而flash的中的真實內容應該是 ROM Size。是不是很神奇?(比RO SIZE多了個 RW,RW不應該是放在RAM中?WHY???)
RW的神奇之處:他雖然是讀寫類型的數據,但是他是非0的數據,也就是上電初始化過程中,要對其進行非0初始化,那么這些特定的非0值從哪里來呢?只能先把用于初始化的數據放到flash中了,從flash中讀取值,然后寫入RAM中相應的RW數據內部。
所以flash中還需要存儲RW的初始數據值。
當你完成hex或者bin文件的燒錄以后,MCU內部存儲數據分布如下:
當MCU上電開始運行以后,存儲分布會發生一些微妙的變化(看破不說破,嘗試自己分析下why會這樣?):