一般在stm32工程使用keil編譯之後,keil的build output欄目下面會出現如圖所示的輸出資訊,其中會顯示code 大小 ro-data、rw-data 、zi-data的大小。一般別人不怎麼會在意這個的大小。
arm程式的組成
此處所說的「arm程式」是指在arm系統中正在執行的程式,而非儲存在rom中的bin映像(image)檔案,這一點清注意區別。
乙個arm程式包含3部分:ro,rw和zi。ro是程式中的指令和常量;rw是程式中的已初始化變數;zi是程式中的未初始化的變數.
由以上3點說明可以理解為:ro就是readonly,rw就是read/write,zi就是zero
arm映像檔案的組成
所謂arm映像檔案就是指燒錄到rom中的bin檔案,也稱為image檔案。以下用image檔案來稱呼它。
image檔案包含了ro和rw資料。之所以image檔案不包含zi資料,是因為zi資料都是0,沒必要包含,只要程式執行之前將zi資料所在的區域一律清零即可。包含進去反而浪費儲存空間。
q:為什麼image中必須包含ro和rw?
a:因為ro中的指令和常量以及rw中初始化過的變數是不能像zi那樣「無中生有」的。
arm程式的執行過程
從以上兩點可以知道,燒錄到rom中的image檔案與實際執行時的arm程式之間並不是完全一樣的。因此就有必要了解arm程式是如何從rom中的image到達實際執行狀態的。
實際上,ro中的指令至少應該有這樣的功能:
1. 將rw從rom中搬到ram中,因為rw是變數,變數不能存在rom中。
2. 將zi所在的ram區域全部清零,因為zi區域並不在image中,所以需要程式根據編譯器給出的zi位址及大小來將相應得ram區域清零。zi中也是變數,同理:變數不能存在rom中
在程式執行的最初階段,ro中的指令完成了這兩項工作後c程式才能正常訪問變數。否則只能執行不含變數的**。
按照上面的我標紅色的部分的解釋,這樣的話ro-data、rw-data和code的大小加起來就是最終的燒入程式的大小,但是好像事情不是這麼簡單的。看截圖:
上面是執行的過程,然後我們可以看生成的bin檔案大小。
stm32後生成編譯檔案大小探索之二
之前總結過編譯檔案大小的一些研究 總結起來是這樣的 微控制器 生產的編譯資訊中,包含了 code 資訊 ro data 唯讀資訊 程式中的指令 和常量 rw data 被初始化的變數 zi data 無需初始化的變數 我做了這麼乙個實驗,增加乙個很大的陣列,不初始化或者初始化為0 它會被分配到zi ...
stm32生成bin axf檔案
圖1 如圖1錯誤記錄一下在使用stm32生成bin axf檔案注意的問題。生成bin axf檔案的路徑要選擇正確,比如工程當前目錄使用.也沒有問題 我的bin檔案放在工程目錄下級目錄bin中,故使用.bin a1 boot f3.bin 生成bin axf檔案需要設定一些選項,如圖2和3 圖2 圖3...
STM32生成bin檔案
方案一 第一步 開啟options for target target 1 對話方塊,選擇user標籤頁 第二步 找到fromelf.exe的路徑 keil5在armcc裡 第三步 重點 基路徑是工程路徑,bin檔案是根據axf生成的 接下來要做的要視情況而定 選完fromelf.exe後在輸入框中...