微吼云上線多路互動直播服務(wù) 加速多場景互動直播落地
795
2022-05-29
3.3 RT-Thread程序內(nèi)存分布
一般MCU包含的存儲空間有片內(nèi)Flash與片內(nèi)RAM,RAM相當(dāng)于內(nèi)存,F(xiàn)lash相當(dāng)于硬盤。編譯器會將一個程序分類為好幾個部分,分別存儲在MCU不同的存儲區(qū)。
Keil工程在編譯完之后,會有相應(yīng)的程序所占用的空間提示信息,如下所示:
linking...
Program Size: Code=48008 RO-data=5660 RW-data=604 ZI-data=2124
After Build - User command #1: fromelf --bin .\build\rtthread-stm32.axf --output rtthread.bin
".\build\rtthread-stm32.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed:? 00:00:07
上面提到的Program Size包含以下幾個部分。
(1)Code:代碼段,存放程序的代碼部分。
(2)RO-data:只讀數(shù)據(jù)段,存放程序中定義的常量。
(3)RW-data:讀寫數(shù)據(jù)段,存放初始化為非0值的全局變量。
(4)ZI-data:0數(shù)據(jù)段,存放未初始化的全局變量及初始化為0的變量。
編譯完工程后會生成一個.map文件,該文件說明了各個函數(shù)占用的尺寸和地址,在該文件的最后幾行也說明了上面幾個字段的關(guān)系:
Total RO? Size (Code + RO Data)??????????????? 53668 (? 52.41kB)
Total RW? Size (RW Data + ZI Data)????????????? 2728 (?? 2.66kB)
Total ROM Size (Code + RO Data + RW Data)????? 53780 (? 52.52kB)
(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或者h(yuǎn)ex文件,該被燒錄文件稱為可執(zhí)行映像文件。圖3-3中左圖是可執(zhí)行映像文件燒錄到STM32后的內(nèi)存分布,它包含RO段和RW段兩個部分:其中RO段中保存了Code、RO-data的數(shù)據(jù),RW段中保存了RW-data的數(shù)據(jù),由于ZI-data都是0,所以未包含在映像文件中。
圖3-3 RT-Thread內(nèi)存分布
STM32在上電啟動之后默認(rèn)從Flash啟動,啟動之后會將RW段中的RW-data(初始化的全局變量)搬運到RAM中,但不會搬運RO段,即CPU的執(zhí)行代碼從Flash中讀取,另外根據(jù)編譯器給出的ZI地址和大小分配出ZI段,并將這塊RAM區(qū)域清零。
其中動態(tài)內(nèi)存堆為未使用的RAM空間,應(yīng)用程序申請和釋放的內(nèi)存塊都來自該空間。
如下面的例子所示:
rt_uint8_t* msg_ptr;
msg_ptr = (rt_uint8_t*) rt_malloc (128);
rt_memset(msg_ptr, 0, 128);
代碼中的 msg_ptr 指針指向的128字節(jié)內(nèi)存空間位于動態(tài)內(nèi)存堆空間中。
而一些全局變量則存放于RW段和ZI段中,RW段存放的是具有初始值的全局變量(而常量形式的全局變量則放置在RO段中,是只讀屬性的),ZI段存放的系統(tǒng)未初始化的全局變量,如下面的例子所示:
#include
const static rt_uint32_t sensor_enable = 0x000000FE;
rt_uint32_t sensor_value;
rt_bool_t sensor_inited = RT_FALSE;
void sensor_init()
{
/* ... */
}
sensor_value存放在ZI段中,系統(tǒng)啟動后會自動初始化為零(由用戶程序或編譯器提供的一些庫函數(shù)初始化為零)。sensor_inited變量則存放在RW段中,而sensor_enable存放在RO段中。
嵌入式
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。