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

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