當(dāng)前位置:首頁 > 嵌入式 > 嵌入式硬件
[導(dǎo)讀]動態(tài)內(nèi)存分配是絕對不能用于硬實(shí)時系統(tǒng)的,因?yàn)閯討B(tài)分配具有時間不確定性(分配時間與內(nèi)存塊數(shù)量有關(guān)),而且動態(tài)分配可能產(chǎn)生分配不成功的情況。所以對于硬實(shí)時系統(tǒng),只能采用靜態(tài)內(nèi)存分配方式。靜態(tài)分配是指在編譯或鏈接時將程序所需的內(nèi)存空間分配好,這樣不會出現(xiàn)分配失敗的情況。

1. 實(shí)時系統(tǒng)內(nèi)存分配

實(shí)時系統(tǒng)分為硬實(shí)時系統(tǒng)和軟實(shí)時系統(tǒng)。硬實(shí)時系統(tǒng)是指系統(tǒng)中各任務(wù)不僅要執(zhí)行無誤而且要做到準(zhǔn)時;軟實(shí)時系統(tǒng)是指系統(tǒng)中各任務(wù)運(yùn)行的越快越好,并不要求限定某一任務(wù)必須在多長時間內(nèi)完成。

可以看出動態(tài)內(nèi)存分配是絕對不能用于硬實(shí)時系統(tǒng)的,因?yàn)閯討B(tài)分配具有時間不確定性(分配時間與內(nèi)存塊數(shù)量有關(guān)),而且動態(tài)分配可能產(chǎn)生分配不成功的情況。所以對于硬實(shí)時系統(tǒng),只能采用靜態(tài)內(nèi)存分配方式。靜態(tài)分配是指在編譯或鏈接時將程序所需的內(nèi)存空間分配好,這樣不會出現(xiàn)分配失敗的情況。

其實(shí)對于大多數(shù)實(shí)時系統(tǒng)而言,內(nèi)存分配都是采用兩種方式的結(jié)合,即動靜結(jié)合的分配方式。

2. 動靜結(jié)合內(nèi)存分配的一種實(shí)現(xiàn)

對于整個內(nèi)存,把它分為4個部分,即中斷向量區(qū)、系統(tǒng)映射區(qū)、系統(tǒng)內(nèi)存區(qū)和用戶內(nèi)存區(qū)。如圖1所示。

其中中斷向量表和系統(tǒng)映射區(qū)在編譯時已經(jīng)設(shè)定好,即采用靜態(tài)分區(qū)的方式。剩下的兩個部分可以按用戶要求配置。

2.1 系統(tǒng)內(nèi)存區(qū)分區(qū)

對于整個系統(tǒng)內(nèi)存區(qū),還需要要進(jìn)行分區(qū)操作,使它產(chǎn)生多個分區(qū),每個分區(qū)中內(nèi)存塊的大小相等,各個分區(qū)之間內(nèi)存塊大小不等。這樣來滿足多種內(nèi)存申請需求。

2.1.1 系統(tǒng)分區(qū)類結(jié)構(gòu)定義

系統(tǒng)建立了一個內(nèi)存塊結(jié)構(gòu),它由一個指向下一個內(nèi)存塊的指針構(gòu)成,因?yàn)橄到y(tǒng)使用單向鏈表來管理空閑內(nèi)存塊,所以必須用每個內(nèi)存塊的這個指針來讓所有的空閑內(nèi)存塊連成一個鏈表。

圖1 內(nèi)存劃分示意圖

結(jié)構(gòu)如下:

struct memblock

{

void * next;

};

對于內(nèi)存分區(qū),采用面向?qū)ο蟮姆绞?,這樣減少了全局變量的使用,同時提高了可操作性。系統(tǒng)建立了內(nèi)存分區(qū)類結(jié)構(gòu)。它包含了該分區(qū)的信號量、內(nèi)存區(qū)的起始地址、內(nèi)存塊大小、內(nèi)存塊數(shù)量、空閑內(nèi)存塊數(shù)量、空閑內(nèi)存塊鏈表和鏈表尾部等。類結(jié)構(gòu)定義如下:

class mempartition

{

private:

semphore s;//控制該內(nèi)存分區(qū)的信號量

public:

long *start;//塊起始位置

void *freeulist;//空閑內(nèi)存塊鏈表

void *tail;//空閑內(nèi)存塊鏈表尾部

int unitsize;//內(nèi)存塊大小

short unitnum;//內(nèi)存塊數(shù)量

short freeunum;//空閑內(nèi)存塊數(shù)量

mempartition();//初始化鏈表、信號量

void *GetUnit();//獲取內(nèi)存塊

void PutUnit(void *);//釋放內(nèi)存塊

};

因?yàn)槊總€內(nèi)存分區(qū)都是多任務(wù)共享的,每次只能有一個任務(wù)或中斷服務(wù)程序進(jìn)入該內(nèi)存分區(qū),所以需要設(shè)置信號量來管理它,當(dāng)然也可以采用關(guān)中斷的方式,關(guān)中斷可能導(dǎo)致中斷響應(yīng)延遲等問題,所以沒有采用這種方式。

圖2 流程圖

2.1.2 系統(tǒng)分區(qū)的實(shí)現(xiàn)

通過Partition_Create()函數(shù)創(chuàng)建一個內(nèi)存分區(qū),函數(shù)定義為

int Partition_Create(mempartition *mp,unsigned int unum,unsigned int usize);

mp為創(chuàng)建的內(nèi)存分區(qū),unum為該分區(qū)中內(nèi)存塊數(shù)量,usize為內(nèi)存塊大小。函數(shù)流程圖如圖2所示。

對于塊內(nèi)存的申請,采用c語言提供的malloc函數(shù)從內(nèi)存中申請。這對于程序設(shè)計者而言提供了極大的方便,對于系統(tǒng)分區(qū)不適合嵌入式應(yīng)用(該實(shí)時系統(tǒng)設(shè)計應(yīng)用于嵌入式設(shè)備中)需求的情況下,可以刪除該分區(qū)另外再建立。不過這樣做的情況應(yīng)該盡可能少,因?yàn)槎啻握{(diào)用malloc/free會產(chǎn)生較多的內(nèi)存碎片。在做設(shè)計時,應(yīng)該盡可能預(yù)先設(shè)定好分區(qū)數(shù)量和各個分區(qū)中內(nèi)存塊的數(shù)量和大小,盡管系統(tǒng)提供了重建分區(qū)的功能。

每個塊內(nèi)存的第一部分存儲該分區(qū)對象,其后才是各個內(nèi)存塊。在內(nèi)存塊空閑時,其內(nèi)部存儲了下一個節(jié)點(diǎn)的的指針。分配以后,該信息丟失,直接分配給申請者,這樣省掉了存儲每個內(nèi)存塊信息額外的RAM開銷。內(nèi)存釋放時,直接加到該分區(qū)空閑內(nèi)存鏈表的尾部,同時設(shè)定下一個節(jié)點(diǎn)內(nèi)存塊信息為NULL。這樣在多次分配與釋放后,內(nèi)存塊的位置會發(fā)生比較大的變化。

系統(tǒng)設(shè)置了一個全局鏈表 mempartion **partition_list 來存儲所有的內(nèi)存分區(qū)指針,該鏈表的長度可以動態(tài)定義。也就是說分區(qū)的數(shù)量可以動態(tài)定義。鏈表中的分區(qū)需要進(jìn)行排序,排序的標(biāo)準(zhǔn)是每個分區(qū)中內(nèi)存塊的大小,內(nèi)存塊小的分區(qū)排在前面,內(nèi)存塊大的排在后面。因?yàn)榉謪^(qū)采用首次適配的算法,排序以后可以減少內(nèi)存浪費(fèi)。

同時,系統(tǒng)提供了Mem_Alloc/Mem_Free兩個函數(shù)來支持系統(tǒng)分區(qū)的申請和釋放。申請的算法很簡單,采用首次適配方法從分區(qū)鏈表中找到合適內(nèi)存分區(qū),如果該區(qū)空閑內(nèi)存鏈表不為空,則返回該鏈表第一個內(nèi)存塊地址,否則查看下一個分區(qū)。如果找不到合適的內(nèi)存塊,則返回空指針。

釋放算法稍微復(fù)雜一些,它需要先檢查該內(nèi)存塊屬于哪個分區(qū)。這樣做非常必要,如果把一個小塊放到大塊的內(nèi)存分區(qū)中,一個任務(wù)申請了該空間,則該空間的一部分將跨越到另一個內(nèi)存塊,對該內(nèi)存塊的操作可能覆蓋另一個內(nèi)存塊的數(shù)據(jù)。如果把一個大塊放到了小塊的分區(qū)中,則在分配的時候?qū)⒎峙淞硕嘤嗟目臻g,造成了內(nèi)存空間的浪費(fèi)。找到所圖2創(chuàng)建內(nèi)存分區(qū)流程圖屬分區(qū)后,直接把該塊放到該區(qū)空閑內(nèi)存鏈表的尾部。

上述系統(tǒng)分區(qū)的方式其實(shí)是小范圍動態(tài)分區(qū)上實(shí)現(xiàn)的靜態(tài)方式。因?yàn)槊總€內(nèi)存塊大小是固定的,這樣不可避免地要浪費(fèi)一部分空間。對于這個問題的解決,系統(tǒng)還提供了一種純動態(tài)的解決辦法,就是調(diào)用malloc/free函數(shù)來申請內(nèi)存塊。

2.1.3 內(nèi)存用戶區(qū)的動態(tài)內(nèi)存分配

從內(nèi)存劃分圖中可以看到有一塊用戶內(nèi)存區(qū),這是一塊內(nèi)核不會使用的內(nèi)存區(qū)。該區(qū)留給用戶使用,對于這塊區(qū)域的申請和釋放不調(diào)用系統(tǒng)提供的Mem_Alloc/Mem_Free函數(shù),而是直接調(diào)用c語言提供的malloc/free函數(shù)。malloc具有不確定性,因?yàn)樗膱?zhí)行時間和空閑內(nèi)存塊的數(shù)量有關(guān),而且多次使用malloc/free調(diào)用和釋放內(nèi)存塊,可能產(chǎn)生大量的內(nèi)存碎片。所以這種方式的調(diào)用要謹(jǐn)慎。由于用戶內(nèi)存區(qū)大小是可配置的,所以用戶可以控制該區(qū)大小以減少碎片產(chǎn)生的問題。同時對于系統(tǒng)調(diào)用,例如任務(wù)堆棧分配,不會因?yàn)樗槠喽鴮?dǎo)致分配失敗的問題。

3. 小結(jié)

動靜結(jié)合的方式給用戶提供了比較大的自由度,用戶可以從系統(tǒng)分區(qū)中申請內(nèi)存塊,也可以從用戶內(nèi)存區(qū)申請內(nèi)存塊。這樣增加了系統(tǒng)的靈活性,同時也限制了大量碎片產(chǎn)生的可能(在不頻繁刪除建立系統(tǒng)內(nèi)存分區(qū)的前提下)。也增加了部分c代碼的可移植性。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉