阿九講學(xué)(九)——FreeRTOS堆內(nèi)存管理(一)

從FreeRTOS V9.0.0開始內(nèi)核對象既可以在編譯的時候靜態(tài)分配帖汞,也可以在運行時動態(tài)分配左权。為了盡可能讓FreeRTOS易于使用嘉赎,這些內(nèi)核對象并不是在編譯時靜態(tài)分配的膝晾,而是在運行時動態(tài)分配的米辐。內(nèi)核對象創(chuàng)建時FreeRTOS分配RAM而在內(nèi)核對象刪除時釋放內(nèi)存胸完。這樣簡化了API,并且減少了RAM的占用翘贮。

動態(tài)內(nèi)存分配是C語言編程的概念赊窥,而不是針對FreeRTOS或者多任務(wù)編程的概念。它和FreeRTOS是相關(guān)的狸页,因為內(nèi)核對象是動態(tài)分配的锨能,并且通用編譯器提供的動態(tài)內(nèi)存分配方案對于實時應(yīng)用程序并不總是適合的。

內(nèi)存可以使用標(biāo)準(zhǔn)C庫的malloc()和free()函數(shù)來分配芍耘,但直接調(diào)用這兩個函數(shù)可能不適合腹侣,原因有以下幾點:

1. malloc()和free()函數(shù)在小型嵌入式系統(tǒng)中并不總是可用的

2. 它們的實現(xiàn)可能非常的大,占據(jù)了相當(dāng)大的一塊代碼空間

3. 他們幾乎都不是線程安全的

4. 它們并不是確定的齿穗,每次調(diào)用這些函數(shù)執(zhí)行的時間可能都不一樣

5. 它們有可能產(chǎn)生碎片

6. 它們有可能打亂鏈接器的配置

7. 如果允許堆空間的生長方向覆蓋其他變量占據(jù)的內(nèi)存傲隶,它們會成為debug的災(zāi)難

動態(tài)內(nèi)存分配的可選

從FreeRTOS V9.0.0開始內(nèi)核對象既可以在編譯時靜態(tài)分配也可以在運行時動態(tài)分配。如今FreeRTOS把內(nèi)存分配放在可移植層窃页。這是考慮到不同的嵌入式系統(tǒng)有不同的動態(tài)內(nèi)存管理方法和時間要求跺株,因此單個的動態(tài)內(nèi)存分配算法將只適合于應(yīng)用程序的一個子集复濒。同樣,如果有需要的話乒省,開發(fā)人員可以從核心代碼庫中移除動態(tài)內(nèi)存分配巧颈。

當(dāng)FreeRTOS需要RAM的時候,并不是調(diào)用malloc()袖扛,而是調(diào)用pvPortMalloc()砸泛。當(dāng)需要釋放RAM的時候,并不是調(diào)用free()蛆封,而是調(diào)用vPortFree()唇礁。pvPortMalloc()和標(biāo)準(zhǔn)C庫的malloc()有同樣的函數(shù)原型,vPortFree()和標(biāo)準(zhǔn)C庫的free()有同樣的函數(shù)原型惨篱。

pvPortMalloc()和vPortFree()都是公共函數(shù)盏筐,因此能夠被應(yīng)用代碼調(diào)用。

FreeRTOS對于pvPortMalloc()和vPortFree()提供了5種實現(xiàn)砸讳。FreeRTOS應(yīng)用程序可以使用其中的一種琢融,或者使用自己的實現(xiàn)。

5種實現(xiàn)分別在heap_1.c,heap_2.c,heap_3.c,heap_4.c和heap_5.c文件中簿寂,都存在于文件夾FreeRTOS/Source/portable/MemMang下漾抬。


下面來介紹一下其中的一種實現(xiàn) Heap_1:

小型嵌入式系統(tǒng)通常只在啟動調(diào)度程序之前創(chuàng)建任務(wù)和其他內(nèi)核對象。在這種情況下常遂,內(nèi)存只能在應(yīng)用程序開始執(zhí)行任何實時功能之前由內(nèi)核動態(tài)分配纳令,并且內(nèi)存將在應(yīng)用程序的生命周期內(nèi)保持不被釋放。這意味著所選擇的分配方案不需要考慮任何更復(fù)雜的內(nèi)存分配問題烈钞,比如確定性和碎片化泊碑,而只需要考慮代碼大小和簡單性等屬性坤按。

Heap_1.c實現(xiàn)了一個非程盒溃基本的pvPortMalloc()版本,但沒有實現(xiàn)vPortFree()臭脓。heap_1適用于從不刪除任務(wù)或其他內(nèi)核對象的應(yīng)用程序酗钞。

一些禁止使用動態(tài)內(nèi)存分配的關(guān)鍵的商業(yè)系統(tǒng)和關(guān)鍵的安全系統(tǒng)也有可能使用heap_1。由于擔(dān)心出現(xiàn)不確定性来累、內(nèi)存碎片化和內(nèi)存分配失敗等問題砚作,關(guān)鍵系統(tǒng)通常禁止動態(tài)內(nèi)存分配,但是Heap_1總是確定性的嘹锁,并且不能分割內(nèi)存葫录。

當(dāng)調(diào)用pvPortMalloc()時,heap_1分配方案將簡單數(shù)組細(xì)分為更小的塊领猾。這個數(shù)組稱為FreeRTOS堆米同。

數(shù)組的大小(以字節(jié)為單位)由FreeRTOSConfig.h中的configTOTAL_HEAP_SIZE定義設(shè)置骇扇。以這種方式定義一個大數(shù)組會使應(yīng)用程序看起來消耗大量ram——甚至在從數(shù)組中分配任何內(nèi)存之前也是如此。

每個創(chuàng)建的任務(wù)都需要一個任務(wù)控制塊(TCB)和一個從堆中分配的堆棧面粮。圖5演示了heap_1如何在創(chuàng)建任務(wù)時細(xì)分簡單數(shù)組少孝。

如上圖所示:

A. 在創(chuàng)建任何任務(wù)之前顯示數(shù)組——整個數(shù)組是空閑的。

B. 顯示創(chuàng)建一個任務(wù)后的數(shù)組熬苍。

C. 顯示創(chuàng)建了三個任務(wù)之后的數(shù)組稍走。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市柴底,隨后出現(xiàn)的幾起案子婿脸,更是在濱河造成了極大的恐慌,老刑警劉巖似枕,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盖淡,死亡現(xiàn)場離奇詭異,居然都是意外死亡凿歼,警方通過查閱死者的電腦和手機褪迟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來答憔,“玉大人味赃,你說我怎么就攤上這事∨巴兀” “怎么了心俗?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蓉驹。 經(jīng)常有香客問我城榛,道長,這世上最難降的妖魔是什么态兴? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任狠持,我火速辦了婚禮,結(jié)果婚禮上瞻润,老公的妹妹穿的比我還像新娘喘垂。我一直安慰自己,他們只是感情好绍撞,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布正勒。 她就那樣靜靜地躺著,像睡著了一般傻铣。 火紅的嫁衣襯著肌膚如雪章贞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天非洲,我揣著相機與錄音鸭限,去河邊找鬼就谜。 笑死,一個胖子當(dāng)著我的面吹牛里覆,可吹牛的內(nèi)容都是我干的丧荐。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼喧枷,長吁一口氣:“原來是場噩夢啊……” “哼虹统!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起隧甚,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤车荔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后戚扳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忧便,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年帽借,在試婚紗的時候發(fā)現(xiàn)自己被綠了珠增。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡砍艾,死狀恐怖蒂教,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情脆荷,我是刑警寧澤凝垛,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站蜓谋,受9級特大地震影響梦皮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜桃焕,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一剑肯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧覆旭,春花似錦退子、人聲如沸岖妄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽荐虐。三九已至七兜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間福扬,已是汗流浹背腕铸。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工惜犀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人狠裹。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓虽界,卻偏偏與公主長得像,于是被迫代替她去往敵國和親涛菠。 傳聞我的和親對象是個殘疾皇子莉御,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容