越來越多的嵌入式軟件開發(fā)人員意識到動態(tài)內(nèi)存分配——在需要時獲取大塊內(nèi)存并在以后放棄它們——雖然方便靈活,但也充滿了問題。這些問題不僅限于嵌入式代碼,許多桌面應(yīng)用程序都存在影響性能和可靠性的內(nèi)存泄漏。但在這里我想專注于嵌入式。
質(zhì)疑使用標準malloc()庫函數(shù)的三個關(guān)鍵原因:
內(nèi)存分配可能會失敗。這可能是因為沒有足夠的可用內(nèi)存(在堆中)來滿足請求。也可能是碎片造成的;有足夠的可用內(nèi)存,但沒有連續(xù)的塊足夠大。
該函數(shù)通常是不可重入的。在多線程(多任務(wù))系統(tǒng)中,如果函數(shù)被多個任務(wù)調(diào)用,則它們必須是可重入的。這確保了,如果調(diào)用被中斷,對該函數(shù)的另一次調(diào)用不會危及第一次調(diào)用。
它不是確定性的。在實時系統(tǒng)中,可預(yù)測性(確定性)至關(guān)重要。標準malloc()函數(shù)的執(zhí)行時間非常多變且無法預(yù)測。

這些都是有效的點,并且有解決它們的方法,這通常是使用實時操作系統(tǒng) (RTOS) 提供的功能的問題。
然而,盡管它們是有效的,但問題可能并不總是像看起來那么重要:
如果發(fā)生分配失敗,該函數(shù)將返回一個NULL指針。這很容易檢查,并且可以采取行動。
在許多應(yīng)用程序中,所有內(nèi)存分配和釋放都在單個任務(wù)中執(zhí)行。這使得重入是不必要的。
并非所有嵌入式系統(tǒng)都是實時的,因此可能不需要確定性。
malloc()可能會帶來另一個挑戰(zhàn):它相當(dāng)慢。一些系統(tǒng)需要速度,而不是可預(yù)測性,因此需要考慮找到一種方法來提供此功能的功能并具有更高的性能。
該函數(shù)性能不佳的主要原因是它提供了很多功能。不同大小的內(nèi)存塊的管理是相當(dāng)復(fù)雜的。對于許多應(yīng)用程序來說,這實際上是多余的,因為所需的內(nèi)存分配都是相同的大?。ɑ蛏倭坎煌囊阎笮。?。為固定大小的塊編寫內(nèi)存分配器非常簡單;只是一個帶有使用標志的數(shù)組或者一個鏈表。代碼肯定會更快,甚至可以確定地完成。分配失敗仍然可能發(fā)生,但管理起來很簡單。這種類型的內(nèi)存分配通常由流行的 RTOS 產(chǎn)品提供。
審核編輯:郭婷
-
嵌入式
+關(guān)注
關(guān)注
5200文章
20495瀏覽量
334741 -
RTOS
+關(guān)注
關(guān)注
25文章
866瀏覽量
123091
發(fā)布評論請先 登錄
嵌入式軟件開發(fā)工具市場新動向:訂閱制趨勢下的中國開發(fā)者選擇
RT-Thread Vector軟件包:嵌入式開發(fā)的動態(tài)數(shù)組容器 | 技術(shù)集結(jié)
嵌入式軟件開發(fā)的動態(tài)內(nèi)存分配解決問題
評論