KEIL中如何知道代碼的大小以及如何將變量指定在固定的地方


 

 首先看幾個名詞解釋:

(1) Code(inc.Data) : 包含兩部分,即代碼和數據
- code,即程序代碼部分
- inline data. For example, literal pools(文字常量池), and short strings(短字符串)等. 這個一般被忽略,請大家注意!!!
- 代碼段,存放程序的代碼部分。
(2) RO Data: read-only data,只讀的數據
Shows how many bytes are occupied by read-only data. This is in addition to the inline data included in the Code (inc. data) column. 除inline data 之外的所有只讀數據。
只讀數據段,存放程序中定義的常量。
(3) RW Data: read write data,可讀寫的數據
Shows how many bytes are occupied by read-write data.
讀寫數據段,存放初始化為非0值的全局變量。
(4) ZI Data: zero initialized data,零初始化的可讀寫變量
Shows how many bytes are occupied by zero-initialized data.
0數據段,存放未初始化的全局變量及初始化為0的變量。
存儲Size:
RO size: Code + RO_data,表示程序占用Flash空間的大小。
RW size: RW_data + ZI_data,表示運行時占用RAM的大小。
ROM (minimum)size = Code + RO_data + RW_data (即燒/下載程序到FLASH/ROM時,所占用的最小空間)
Total ROM Size (Code + RO Data + RW Data)這樣所寫的程序占用的ROM的字節總數,也就是說程序所下載到ROM flash 中的大小。為什么Rom中還要存RW,因為掉電后RAM中所有數據都丟失了,每次上電RAM中的數據是被重新賦值的,每次這些固定的值就是存儲在Rom中的,為什么不包含ZI段呢,是因為ZI數據都是0,沒必要包含,只要程序運行之前將ZI數據所在的區域一律清零即可。包含進去反而浪費存儲空間。RAM相當於內存,Flash相當於硬盤。
RAM size: RW Data + ZI Data (即程序運行的時,RAM使用的空間)

通過上述信息可以看出當前代碼編譯后的總大小為:16088+372+204=16664 字節
16664/1024=16.2734375 K
查看編譯后的二進制文件大小

說明理論的計算和實際是相符的。
單片機在上電后默認是從Flash啟動,啟動之后會將RW段中的RW-data(初始化的全局變量)搬運到RAM中,但不會搬運RO段,即CPU的執行代碼從Flash中讀取,另外根據編譯器給出的ZI地址和大小分配出ZI段,並將這塊RAM區域清0.
其中動態內存堆為未使用的RAM空間,應用程序申請和釋放的內存塊都來自於該空間。
————————————————
版權聲明:本文為CSDN博主「qq_511386807」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_20222919/article/details/103779582

 

 從這里可以看出:
芯片IROM大小: 65536個字節

芯片RAM大小: 12x1024 =12288個字節 = 12x1024 byte

查看芯片手冊:

 

 

 


 

 可以通過


免責聲明!

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



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