Keil 中的Code,RO-data,RW-data,ZI-data


    我們開發項目中,編譯、鏈接完成后,都要看一下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程序才能正常訪問變量,否則只能運行不含變量的代碼。

 


免責聲明!

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



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