mdk編譯時的記憶體分析

2022-07-31 16:00:22 字數 1440 閱讀 8945

記憶體四區(**區,全域性區,棧區,堆區)

code:即**域,它指的是編譯器生成的機器指令,這些內容被儲存到rom區。

ro-data:read only data,即唯讀資料域,它指程式中用到的唯讀資料,這些資料被儲存在rom區,因而程式不能修改其內容。例如c語言中const關鍵字定義的變數就是典型的ro-data。

rw-data:read write data,即可讀寫資料域,它指初始化為 「 非0值 」 的可讀寫資料,程式剛執行時,這些資料具有非0的初始值,且執行的時候它們會常駐在ram區,因而應用程式可以修改其內容。例如c語言中使用定義的全域性變數,且定義時賦予「非0值」給該變數進行初始化。

zi-data:zero initialie data,即0初始化資料,它指初始化為「0值」的可讀寫資料域,它與rw-data的區別是程式剛執行時這些資料初始值全都為0,而後續執行過程與rw-data的性質一樣,它們也常駐在ram區,因而應用程式可以更改其內容。例如c語言中使用定義的全域性變數,且定義時賦予「0值」給該變數進行初始化(若定義該變數時沒有賦予初始值,編譯器會把它當zi-data來對待,初始化為0);

zi-data的棧空間(stack)及堆空間(heap):在c語言中,函式內部定義的區域性變數屬於棧空間,進入函式的時候從向棧空間申請記憶體給區域性變數,退出時釋放區域性變數,歸還記憶體空間。而使用malloc動態分配的變數屬於堆空間。在程式中的棧空間和堆空間都是屬於zi-data區域的,這些空間都會被初始值化為0值。編譯器給出的zi-data占用的空間值中包含了堆疊的大小(經實際測試,若程式中完全沒有使用malloc動態申請堆空間,編譯器會優化,不把堆空間計算在內)。

static無論是全域性變數還是區域性變數都儲存在全域性/靜態區域,在編譯期就為其分配記憶體,在程式結束時釋放,

如果需要檢視具體的記憶體可以檢視編譯出來的.map檔案

裡面有詳細的記憶體資訊

stm32f103re的記憶體位址

raw = rw data  + zi data

內建64k位元組的靜態sram。它可以以位元組、半字(16位)或全字(32位)訪問。

起始位址 0x2000 0000

終點位址 0x2000 ffff    

rom = code + ro data + rw data

高達512k位元組快閃儲存器儲存器結構:大容量產品主儲存塊最大為64k×64位,每個儲存塊劃分為256個2k位元組的頁。

頁0 0x0800 0000 - 0x0800 07ff 2k

頁1 0x0800 0800 - 0x0800 0fff 2k

… … …

… … …

頁255 0x0807 f800 - 0x0807 ffff 2k

編譯時的記憶體分配

程式在編譯的時候占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限.2 堆區 heap 亦稱動態記憶體分配.程式在執行的時候用mall...

C C 程式編譯時記憶體分配

1 從靜態儲存區域分配 內存在程式編譯時就已經分配好,這塊內存在程式的整個執行期間都存在。速度快 不容易出錯,因為有系統會善後。例如全域性變數,static變數等。2 在棧上分配 在執行函式時,函式內區域性變數的儲存單元都在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器...

Android編譯時主要瓶頸分析

模擬2個使用者同時登陸乙個4核心處理器的電腦進行android編譯,編譯選項make j8,cpu配置如下 bhsong sha it lintester01 workspace android kernel cat proc cpuinfo processor 0 vendor id genuin...