關于靜態(tài)內存與動態(tài)內存
1.1、靜態(tài)和動態(tài)內存的特點在探討這個問題之前我們先來對比下靜態(tài)內存和動態(tài)內存的特點:1. 創(chuàng)建的時間不同: 創(chuàng)建的時間不同:靜態(tài)分配發(fā)生在程序編譯和連接的時候。動態(tài)分配則發(fā)生在程序調入和執(zhí)行的時候。
編譯鏈接過程中已經(jīng)分配好的
代碼運行過程中使用rt_malloc分配
2. 創(chuàng)建的空間不同:堆都是動態(tài)分配的,沒有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動態(tài)分配。靜態(tài)分配是編譯器完成的,比如局部變量的分配。動態(tài)分配由函數(shù)malloc進行分配。不過棧的動態(tài)分配和堆不同,他的動態(tài)分配是由編譯器進行釋放,無需我們手工實現(xiàn)。
1.2、靜態(tài)和動態(tài)內存的優(yōu)缺點
在了解了靜態(tài)內存和動態(tài)內存不同的特點后可以分析出它們在不同的方面具有不同的優(yōu)缺點:1.靜態(tài)內存編譯階段就分配好了,不會存在分配失敗的情況,除非系統(tǒng)內存被分配完了,但是在編譯階段就可以查出。動態(tài)內存在運行中分配,在正常運行的情況下可能夠正常分配,在某種環(huán)境下可能分配失敗 ,這樣就對開發(fā)者的代碼水平要求更高,要求開發(fā)者需要對代碼的健壯性有要求。
2.靜態(tài)內存由于是編譯階段分配好的,而動態(tài)內存是由運行中分配,這樣動態(tài)內存可以被高效復用,當某段程序使用完畢后,可以將內存交換給內存池中等待下次程序的分配,由于這種機制,開發(fā)者可以利用更小的內存開發(fā)更大型的程序。
3. 動態(tài)內存由于是動態(tài)分配,所以涉及到分配和釋放的問題,假設X程序在分配了ABC3塊內存,程序執(zhí)行完畢后AC區(qū)域內存被釋放,但是由于開發(fā)者的疏忽導致B區(qū)域的內存被遺留。而X程序又是會被反復調用的,這樣我們的內存區(qū)域由于有沒有釋放的區(qū)域導致每次調用就會占用一段區(qū)域,最終系統(tǒng)就沒有內存可以使用。這種情況一般在產(chǎn)品實際體現(xiàn)為最開始的時候設備正常工作,但是運行了幾個小時或者幾天后死機。這種情況一般被稱作內存泄漏(Memory Leak)。4. 在嵌入式RTOS中線程函數(shù)中使用靜態(tài)內存,也就是在線程中定義局部變量,會加大線程棧空間的開銷。
裸機開發(fā)和RTOS開發(fā)的特點
1. 代碼規(guī)模:裸機開發(fā)的項目一般代碼規(guī)模度都比較小,對于一般開發(fā)者都難于駕馭使用裸機開發(fā)超大規(guī)模項目,人力成本和時間成本都太高。反而由于RTOS的模塊化特性,更容易開發(fā)出代碼規(guī)模大的項目。2. 系統(tǒng)穩(wěn)定性:在機電,航空,汽車等行業(yè)都是需要高實時性、高穩(wěn)定性和高安全性的。對于RTOS來說,系統(tǒng)任務的劃分調度都是系統(tǒng)管理,當開發(fā)者對其機制了解不清楚的情況下反而帶來了部分風險。除此之外RTOS上的內存管理也是很大影響系統(tǒng)的,對于RTOS上一般不會存在MMU內存管理單元,也就代表大部分運行RTOS的芯片上都沒有虛擬地址映射,那么就無法利用物理地址和虛擬地址的特性進行內存整理,避免內存泄漏。所以說在RTOS動態(tài)內存這塊內存有風險。
嵌入式中是否應該使用動態(tài)內存
明白不同內存的優(yōu)缺點和裸機RTOS的特點之后,我們在回頭來分析 “嵌入式中是否應該使用動態(tài)內存?” 這個問題。在實時嵌入式系統(tǒng)中,由于系統(tǒng)軟件并不像PC上復雜,一般都是很簡單的內存使用,所以一般也不使用動態(tài)內存管理,但是隨著RTOS面臨的任務越來越重,尤其是IoT和AIoT的到來,讓許多消費級產(chǎn)品運行的RTOS的負擔越來越重。在這種情況下繼續(xù)使用靜態(tài)內存開發(fā)會極大的限制開發(fā)進度,整個開發(fā)的靈活性非常低。同時靜態(tài)的內存無法復用使用同一片內存區(qū)域,相比與動態(tài)內存在大型項目中一般會使用更多的內存,在內存大小不容樂觀的嵌入式系統(tǒng)是很難接受的。但是針對一些高穩(wěn)定性和高安全性的項目來說,使用動態(tài)內存就需要好好斟酌下,由于RTOS上基本沒有MMU的硬件支持或者是系統(tǒng)軟件支持,所以不可避免的系統(tǒng)中會出現(xiàn)內存碎片,從而有可能導致系統(tǒng)異常。
最終說了這么多總結成以下幾點:
1. 沒有使用RTOS的項目:不建議使用動態(tài)內存,這種項目一般很簡單,不必使用動態(tài)內存增大系統(tǒng)開銷和復雜度。
2. 使用RTOS的消費級項目:建議使用動態(tài)內存,一般這種項目代碼復雜度比裸機高,合理使用動態(tài)內存會有效降低內存的開銷。同時很多Github項目的linux程序都是會使用內存管理,有這套機制能更加方便的移植代碼。
3. 使用RTOS的軍工、航天、醫(yī)療等高穩(wěn)定性和高安全性項目:建議盡量降低對動態(tài)內存的使用與依賴以確保系統(tǒng)的穩(wěn)定性。當然也不代表動態(tài)內存就無法在這些項目上使用,只是要求系統(tǒng)開發(fā)者對系統(tǒng)內存的把控要求更高。
RT-Thread的內存管理
RT-Thread 操作系統(tǒng)在內存管理上,根據(jù)上層應用及系統(tǒng)資源的不同,有針對性地提供了不同的內存分配管理算法。總體上可分為兩類:內存堆管理與內存池管理,而內存堆管理又根據(jù)具體內存設備劃分為三種情況:
第一種是針對小內存塊的分配管理(小內存管理算法);第二種是針對大內存塊的分配管理(slab 管理算法);第三種是針對多內存堆的分配情況(memheap 管理算法)。
小內存管理算法是一個簡單的內存分配算法。初始時,它是一塊大的內存。當需要分配內存塊時,將從這個大的內存塊上分割出相匹配的內存塊,然后把分割出來的空閑內存塊還回給堆管理系統(tǒng)中。每個內存塊都包含一個管理用的數(shù)據(jù)頭,通過這個頭把使用塊與空閑塊用雙向鏈表的方式鏈接起來。
-
動態(tài)內存
+關注
關注
1文章
24瀏覽量
7961 -
靜態(tài)內存
+關注
關注
0文章
5瀏覽量
1390
原文標題:嵌入式中是否應該使用動態(tài)內存?
文章出處:【微信號:RTThread,微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論