嵌入式實時操作系統(tǒng):RT-Thread設(shè)計與實現(xiàn)》 —3.3 RT-Thread程序內(nèi)存分布

      網(wǎng)友投稿 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)存分布

      《嵌入式實時操作系統(tǒng):RT-Thread設(shè)計與實現(xiàn)》 —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)容。

      上一篇:Python:嘗試對知乎網(wǎng)驗證碼進(jìn)行處理
      下一篇:DIS Agent 常見客戶問題
      相關(guān)文章
      亚洲字幕AV一区二区三区四区| 亚洲AV无码专区国产乱码4SE| 亚洲AV无码专区在线播放中文| 亚洲中文字幕无码爆乳av中文 | 精品亚洲一区二区三区在线观看 | 亚洲视频在线不卡| 亚洲人成人网站色www| 亚洲人精品午夜射精日韩| 中文字幕亚洲综合久久菠萝蜜 | 亚洲人成77777在线播放网站不卡| 亚洲一级片在线观看| 亚洲乱人伦精品图片| 国产色在线|亚洲| 亚洲一久久久久久久久| 亚洲а∨精品天堂在线| 国产精品亚洲专区一区| 日韩亚洲精品福利| 国产国拍亚洲精品福利| 在线a亚洲v天堂网2019无码| 亚洲国产精华液网站w| 亚洲图片在线观看| 亚洲成在人线中文字幕| 最新国产成人亚洲精品影院| 亚洲精品精华液一区二区| 日本亚洲欧美色视频在线播放| 亚洲 另类 无码 在线| 亚洲成A∨人片天堂网无码| 久久国产成人精品国产成人亚洲 | 亚洲人成77777在线播放网站不卡 亚洲人成77777在线观看网 | 久久久久亚洲AV片无码下载蜜桃| 亚洲美女人黄网成人女| 亚洲精品中文字幕无乱码麻豆| 亚洲男同gay片| 日本亚洲高清乱码中文在线观看| 亚洲精品无码永久在线观看| 亚洲无av在线中文字幕| 亚洲人成电影在在线观看网色| 亚洲午夜在线一区| 亚洲av无码成人精品区一本二本| 亚洲高清免费视频| 亚洲成AV人片在线观看ww|