動態ram依靠什麼儲存資訊 程式的組成 儲存與執行

2021-10-16 10:28:51 字數 2370 閱讀 7915

1、rt-thread程式設計手冊《um4003-rtthread-programming-manual》

2、野火《零死角玩轉stm32—f429挑戰者v2》

一般 mcu 包含的儲存空間有:片內 flash 與片內 ram, ram 相當於記憶體, flash 相當於硬碟。編譯器會將乙個程式分類為好幾個部分,分別儲存在 mcu 不同的儲存區。下面看一下stm32的程式是如何組成的:

首先看一下編譯過程。之前分享過c程式的編譯過程的筆記,可移步至《c程式的編譯過程是怎樣的?》進行檢視。

下面簡單看一下mdk的編譯過程(它與其它編譯器的工作過程是類似的 ):

(1) 編譯, mdk 軟體使用的編譯器是armccarmasm,它們根據每個 c/c++和彙編原始檔編譯成對應的以「.o」為字尾名的物件檔案(object code,也稱目標檔案),其內容主要是從原始檔編譯得到的機器碼,包含了**、資料以及除錯使用的資訊; (2) 鏈結,鏈結器armlink把各個.o 檔案及庫檔案鏈結成乙個映像檔案.axf.elf

這些編譯工具都存在於我們mdk的安裝目錄下,如:

程式在我們的mdk編譯後,build output視窗顯示資訊如下:

program size 包含以下幾個部分:

1) code:**段,存放程式的**部分; 2) ro-data:唯讀資料段,存放程式中定義的常量; 3) rw-data:讀寫資料段,存放初始化為非 0 值的全域性變數; 4) zi-data: 0 資料段,存放未初始化的全域性變數及初始化為 0 的變數;

1) ro size 包含了 code 及 ro-data,表示程式占用 flash 空間的大小; 2) rw size 包含了 rw-data 及 zi-data,表示執行時占用的 ram 的大小; 3) rom size 包含了 code、 ro data 以及 rw data,表示燒寫程式所占用的 flash 空間的大小;

程式執行之前,需要有檔案實體被燒錄到 stm32 的 flash 中,一般是bin或者hex檔案,該被燒錄檔案稱為可執行映像檔案。stm32程式記憶體分布如:

左圖是可執行映像檔案燒錄到 stm32 後的記憶體分布,它包含 ro 段和 rw 段兩個部分:其中 ro 段中儲存了code、 ro-data 的資料, rw 段儲存了 rw-data 的資料,由於 zi-data 都是 0,所以未包含在映像檔案中。

stm32 在上電啟動之後預設從 flash 啟動,啟動之後會將 rw 段中的 rw-data(初始化的全域性變數)搬運到 ram 中,但不會搬運 ro 段,即 cpu 的執行**從 flash 中讀取,另外根據編譯器給出的 zi 位址和大小分配出 zi 段,並將這塊 ram 區域清零。

其中動態記憶體堆為未使用的 ram 空間,應用程式申請和釋放的記憶體塊都來自該空間。如下面的例子:

**中的 msg_ptr 指標指向的 128 位元組記憶體空間位於動態記憶體堆空間中。

而一些全域性變數則是存放於 rw 段和 zi 段中, rw 段存放的是具有初始值的全域性變數(而常量形式的全域性變數則放置在 ro 段中,是唯讀屬性的), zi 段存放的系統未初始化的全域性變數,如下面的例子:

sensor_value 存放在 zi 段中,系統啟動後會自動初始化成零(由使用者程式或編譯器提供的一些庫函式初始化成零)。 sensor_inited 變數則存放在 rw 段中,而 sensor_enable 存放在 ro 段中。

session中適合儲存什麼資訊呢?

http本身無狀態,說白了就是不儲存任何使用者資訊。所以引入cookie 客戶端方案 session 服務端方案 來儲存使用者資訊 這些資訊通常包括什麼,不能包括什麼呢?1.身份資訊 登陸狀態 2.使用者的個性配置 許可權列表 3.其他的一些通用資料 比如購物車 4 登入憑證,許可權 session...

session中適合儲存什麼資訊呢?

http本身無狀態,說白了就是不儲存任何使用者資訊。所以引入cookie 客戶端方案 session 服務端方案 來儲存使用者資訊 這些資訊通常包括什麼,不能包括什麼呢?1.身份資訊 登陸狀態 2.使用者的個性配置 許可權列表 3.其他的一些通用資料 比如購物車 4 登入憑證,許可權 session...

3 動態儲存管理和程式除錯

point.h include include using namespace std class point void set point 設定x,y void display point 顯示x,y double lenth point 計算折現長度 const int num 10 設定開闢記...