我們開發項目中,編譯、鏈接完成后,都要看一下RAM和Flash的利用情況,尤其在有bootloader的情況下,確保自己的單片機選型能符合項目的要求。其中ARM程序的組成,是很容易混淆的。
此處所說的“ARM程序”是指在ARM系統中正在執行的程序,而非保存在Flash中的bin映像(image)文件,這一點清注意區別。
一、Code,RO-data,RW-data,ZI-data所代表的意思
下圖是車檢器項目的APP利用情況:
圖1
Code = 10956 Code 表示 程序代碼部分,即指令
RO-data = 2196 Read Only 表示 程序定義的常量,如const關鍵字定義的常量數組或者長量(一般作為掉電后的標記),函數中的常量
RW-data = 76 Read Write 表示 已初始化的變量(全局和局部變量)
ZI-data = 9908 Zero Initialize 表示 未初始化的變量(全局和局部變量)
二、查找..\Lists文件夾中Project.map文件,查看使用的MCU資源:
圖2
1、Flash占用
圖3
由上圖2和圖3可知,Size:0x33ac.....13228,因此flash占用如下:
Code, RO-data, RW-data ............flash
2、RAM占用
圖4
由上圖2和圖4可知,Size:0x2700.....9984,因此RAM占用如下:
RW-data, ZI-data...................RAM
二、單片機啟動過程中Code,RO-data,RW-data,ZI-data的操作流程
1、ARM映像文件的組成
所謂ARM映像文件就是指燒錄到Flash中的bin文件,也稱為image文件
image文件包含了Code, RO-data, RW-data數據。
之所以image文件不包含ZI-data,是因為ZI-data都是0,沒必要包含,只要程序運行之前將ZI數據所在的區域一律清零即可,包含進去浪費存儲空間。
Q:為什么image中必須包含Code, RO-data, RW-data?
A:因為Code+RO-data中的指令和常量以及RW-data中初始化過的變量是不能像ZI-data那樣“無中生有”的。
2、ARM運行程序的組成
所謂ARM運行程序,是指在ARM系統中正在執行的程序
3、單片機啟動過程 Code,RO-data,RW-data,ZI-data的工作過程
燒錄到ROM中的image文件與實際運行時的ARM程序之間並不是完全相同的,因此就有必要了解ARM運行程序是如何從Flash中的image狀態達到實際運行狀態
1、上電初始化時,將RW-data從flash拷貝到RAM中,因為RW-data是變量,變量不能存在Flash中,存儲的數據要隨計算結果隨時改變。
2、上電初始化時,將ZI-data所在的RAM區域全部清零,因為ZI-data區域並不在image中,所以需要程序根據編譯器給出的ZI-data地址及大小來將相應的RAM區域清零。ZI-data中也是變量,同理,變量不能存在Flash中,在程序運行的最初階段,Flash中的指令完成了這兩項工作后C程序才能正常訪問變量,否則只能運行不含變量的代碼。