999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

μC/OS與FREERTOS動態(tài)內(nèi)存管理機(jī)制的分析與比較

2016-10-21 16:08:10肖蕾劉克江
軟件工程 2016年5期
關(guān)鍵詞:管理機(jī)制

肖蕾 劉克江

摘 要:在嵌入式系統(tǒng)領(lǐng)域,如何合理地分配和管理系統(tǒng)內(nèi)存RAM資源是程序員必須面對的問題,能否高效、可靠、實時地管理動態(tài)內(nèi)存分區(qū)決定了整個系統(tǒng)的穩(wěn)定性和可靠性。本文以μC/OS與FREERTOS兩種操作系統(tǒng)為例,在深入研究其動態(tài)內(nèi)存管理機(jī)制的基礎(chǔ)上,對其優(yōu)缺點和適用場合進(jìn)行了分析比較,便于軟件開發(fā)人員在實際應(yīng)用中根據(jù)產(chǎn)品不同需求進(jìn)行針對性的選擇。

關(guān)鍵詞:μC/OS FREERTOS;嵌入式系統(tǒng);動態(tài)內(nèi)存;管理機(jī)制

中圖分類號:TP316.2 文獻(xiàn)標(biāo)識碼:A

Abstract:In the embedded system field,every programmer has to face the problem about how to reasonably allocate and manage the RAM resource.Stability and reliability of a whole system are determined by the programmer's capability to carry out efficient,reliable and real-time management of dynamic memory partition.Based on in-depth study of μC/OS and FREERTOS dynamic memory management mechanism,the paper comparatively analyzes the advantages,disadvantages and the application occasions,which facilitates developers to make targeted selection of operating systems based on different product requirements in practical applications.

Keywords:μC/OS;FREERTOS;embedded systems;dynamic memory;management mechanism

1 引言(Introduction)

在嵌入式系統(tǒng)領(lǐng)域中,內(nèi)存RAM一直是一種稀缺資源。如何合理地分配和管理系統(tǒng)的內(nèi)存資源是嵌入式軟件程序員必須面對的問題,特別是在產(chǎn)品必須使用到動態(tài)內(nèi)存分配時,能否高效、可靠、實時地管理動態(tài)內(nèi)存分區(qū)決定了整個系統(tǒng)的穩(wěn)定性和可靠性[1,2]。

針對這種情況,程序員常用的解決辦法主要包括下面三種:在系統(tǒng)啟動時就按最壞考慮分配足夠大的數(shù)組、根據(jù)實際需求自行編寫內(nèi)存管理程序或直接使用編譯器提供的malloc和free函數(shù)、基于嵌入式操作系統(tǒng)內(nèi)存管理機(jī)制來處理。如果程序員能夠充分掌握整個系統(tǒng)所有可能出現(xiàn)的情況,根據(jù)最壞需求在系統(tǒng)啟動時就給每一項作業(yè)分配一塊足夠大的數(shù)組是最簡單和直接的方法,但勢必會造成內(nèi)存浪費(fèi),且如果作業(yè)需要數(shù)組類型是多種的情況很可能會陷入內(nèi)存空間不足的困境[3]。根據(jù)產(chǎn)品軟件設(shè)計的需求自行編寫簡單短小的內(nèi)存管理程序,對于有經(jīng)驗程序員來說不成問題,但是這種方法也存在著不同平臺通用性較差、管理程序穩(wěn)定性和可靠性因人而異,另外,malloc和free函數(shù)并不是所有平臺都可以使用且代碼不可見。移植現(xiàn)成的嵌入式操作系統(tǒng),基于操作系統(tǒng)下的內(nèi)存管理機(jī)制來處理系統(tǒng)的動態(tài)內(nèi)存問題是比較方便而且可靠的解決辦法,但程序員必須深入了解所使用操作系統(tǒng)動態(tài)內(nèi)存管理機(jī)制的特點和區(qū)別,并能夠針對不同的處理器資源對操作系統(tǒng)進(jìn)行一定程度裁剪。

上述三種方法中程序員大多比較傾向于移植現(xiàn)有成熟的嵌入式操作系統(tǒng)來處理,本文以μC/OS與FREERTOS兩種操作系統(tǒng)為例,在深入研究其動態(tài)內(nèi)存管理機(jī)制的基礎(chǔ)上,對其優(yōu)缺點和適用場合進(jìn)行了分析比較,便于軟件開發(fā)人員在實際應(yīng)用中根據(jù)產(chǎn)品不同需求進(jìn)行針對性的選擇。

2 內(nèi)存管理算法(Memory management algorithm)

2.1 μC/OS動態(tài)內(nèi)存管理

在μC/OS操作系統(tǒng)中,使用動態(tài)分配內(nèi)存時必須先調(diào)用OSMemCreate函數(shù)建立并初始化一個內(nèi)存區(qū),該內(nèi)存區(qū)會被分割成n塊固定大小的內(nèi)存塊。OSMemCreate函數(shù)傳遞參數(shù)指定內(nèi)存區(qū)起始地址、每塊內(nèi)存塊大小以及內(nèi)存塊數(shù)量。初始化后的結(jié)構(gòu)在每一塊空閑塊開頭存放著指向下一塊空閑塊指針。初始化后μC/OS為每一個動態(tài)內(nèi)存區(qū)定義一個“內(nèi)存控制塊”來記錄和跟蹤該區(qū)的使用情況,包含內(nèi)存分區(qū)指針、空閑塊鏈表指針、每塊內(nèi)存大小、內(nèi)存塊數(shù)目和空閑內(nèi)存塊數(shù)目,其結(jié)構(gòu)為:

typedef struct

void *OSMemAddr;

void *OSMemFreeList;

INT32U OSMemBlkSize;

INT32U OSMemNBlks;

INT32U OSMemNFree;

﹜OS_MEM;

當(dāng)用戶程序調(diào)用函數(shù)OSMemGet申請一塊動態(tài)內(nèi)存時,系統(tǒng)便通過“內(nèi)存控制塊”將空閑塊鏈表指向的第一塊空閑內(nèi)存塊分配給程序,同時將空閑塊鏈表指針指向下一個空閑塊并更新空閑塊數(shù)目。在程序需要釋放內(nèi)存時調(diào)用OSMemPut函數(shù),系統(tǒng)根據(jù)“內(nèi)存控制塊”把回收的內(nèi)存塊插入到空閑塊鏈表表頭,并更新空閑塊數(shù)目。由此可見,μC/OS每次分配和回收動態(tài)內(nèi)存的時間是確定的,每一次分配和回收的內(nèi)存大小已知,且沒有內(nèi)存碎片的存在。

μC/OS為了保證內(nèi)存管理時間確定性和解決內(nèi)存碎片問題,在用戶程序初始化一塊動態(tài)內(nèi)存區(qū)時便指定了該內(nèi)存區(qū)每一塊內(nèi)存塊長度,申請動態(tài)內(nèi)存時只能得到初始化時指定的大小,OSMemGet這個函數(shù)并不需要用戶程序指定需要申請的內(nèi)存長度,內(nèi)存塊長度由圖2內(nèi)存控制塊中的OSMemBlkSize決定。如果出現(xiàn)多個需要動態(tài)使用內(nèi)存的任務(wù),且每個任務(wù)所需的內(nèi)存塊長度都不一樣,程序員可以多次調(diào)用OSMemCreate函數(shù)創(chuàng)建包含不同大小內(nèi)存塊的動態(tài)內(nèi)存區(qū),最大創(chuàng)建的內(nèi)存區(qū)數(shù)目可通過OS_MAX_MEM_PART設(shè)定,然后程序需要多大的內(nèi)存塊就到對應(yīng)內(nèi)存控制塊中申請即可;另一種做法就是調(diào)用OSMemCreate時根據(jù)最大內(nèi)存塊大小去初始化一塊動態(tài)內(nèi)存區(qū),所有程序都在該內(nèi)存區(qū)中申請和釋放動態(tài)內(nèi)存,在調(diào)用OSMemGet得到一塊較大的內(nèi)存塊時強(qiáng)制轉(zhuǎn)換成具體程序所需的數(shù)據(jù)格式即可。

通過分析可知μC/OS處理動態(tài)內(nèi)存的方法具有如下優(yōu)點:

(1)μC/OS對動態(tài)內(nèi)存分區(qū)的管理機(jī)制在操作上時間是可確定的。

(2)不會產(chǎn)生所謂動態(tài)內(nèi)存碎片,可以最大限度保證系統(tǒng)的穩(wěn)定性和可靠性。

(3)每一動態(tài)內(nèi)存塊大小固定,每個空閑內(nèi)存塊頂部只需存儲下一個空閑塊指針,減小了系統(tǒng)額外開支。

但是,該算法的缺點也是顯而易見的:

(1)不能靈活充分利用整個內(nèi)存空間。無論是創(chuàng)建多個內(nèi)存區(qū)還是根據(jù)最大內(nèi)存塊創(chuàng)建一個內(nèi)存區(qū),都會造成嚴(yán)重的內(nèi)存空間浪費(fèi)。

(2)缺乏靈活性。用戶程序之所以使用動態(tài)內(nèi)存分配目的便是為了提高靈活性,但是μC/OS在初始化動態(tài)內(nèi)存區(qū)時便將其劃分為固定大小的連續(xù)存取區(qū),這樣在某些時候不能確定某個內(nèi)存塊大小時便無法通過該算法解決問題。

(3)不檢查回收內(nèi)存塊的合法性。μC/OS的內(nèi)存回收函數(shù)OSMemPut在回收內(nèi)存時并不檢查所回收的內(nèi)存塊是否是本動態(tài)內(nèi)存區(qū)的空間,用戶程序調(diào)用OSMemPut函數(shù)時傳遞任何參數(shù),只要內(nèi)存控制塊中OSMemNFree小于OSMemNBlks便將該參數(shù)指向的空間作為空閑塊鏈表節(jié)點插入到空閑塊鏈表中,這種情況導(dǎo)致的后果是將是不可預(yù)估的。

2.2 FreeRTOS動態(tài)內(nèi)存管理

FreeRTOS是一個微型嵌入式操作系統(tǒng)內(nèi)核,具有源碼公開、免費(fèi)、可裁剪、調(diào)度策略靈活和簡單易用等特點,被很多嵌入式開發(fā)人員所選用[4,5]。對于內(nèi)存管理,F(xiàn)reeRTOS根據(jù)使用者實際需求提供三種策略,每種策略對應(yīng)獨(dú)立的源文件,需要將對應(yīng)的文件移植到工程中[6-8]。

策略一是三個方案中最簡單的,系統(tǒng)根據(jù)onfigTOTAL_HEAP_SIZE設(shè)定的大小劃分一塊內(nèi)存作為動態(tài)內(nèi)存區(qū),同時定義變量xNextFreeByte標(biāo)志空閑區(qū)域的位置,初始值為0。當(dāng)用戶程序申請動態(tài)內(nèi)存時便返回當(dāng)前xNextFreeByte代表的內(nèi)存地址,并將xNextFreeByte加上所申請內(nèi)存塊長度,且內(nèi)存一旦分配便不允許釋放,策略一中沒有提供內(nèi)存回收方法。

策略二中建立空閑分區(qū)鏈表采用首次適應(yīng)算法分配動態(tài)內(nèi)存,允許分配后的動態(tài)內(nèi)存調(diào)用釋放函數(shù)進(jìn)行回收,然而,它不具備將鄰近空閑塊合并成一個大空閑塊的功能。FreeRTOS為動態(tài)內(nèi)存分區(qū)中每一塊空閑塊建立一個“空閑分區(qū)節(jié)點”,并將該節(jié)點存放于空閑塊頂部。該節(jié)點數(shù)據(jù)結(jié)構(gòu)包含指向下一節(jié)點指針和本空閑分區(qū)大小。同時定義一個開始節(jié)點和終止節(jié)點作為空閑分區(qū)鏈表的表頭和結(jié)尾,當(dāng)用戶程序調(diào)用函數(shù)pvPortMalloc申請動態(tài)內(nèi)存時,便從空閑分區(qū)鏈表表頭節(jié)點開始查找合適大小的內(nèi)存塊(即該空閑內(nèi)存分區(qū)大于或等于所申請內(nèi)存),找到則返回該空閑分區(qū)存儲地址并修改該塊“空閑分區(qū)節(jié)點”內(nèi)容,判斷該塊剩余空間是否可以創(chuàng)建“空閑分區(qū)節(jié)點”,可以則將該塊剩余空間劃分為新的空閑塊并建立新的“空閑分區(qū)節(jié)點”,最后更新空閑分區(qū)鏈表,F(xiàn)reeRTOS空閑分區(qū)節(jié)點數(shù)據(jù)結(jié)構(gòu)如下所示。

typedef struct A_BLOCK_LINK

struct A_BLOCK_LINK *pxNextFreeBlock;

size_t xBlockSize;

﹜xBlockLink;

通過上述分析可以得出FreeRTOS策略二具有下列優(yōu)點:

(1)根據(jù)用戶程序申請的每一塊動態(tài)內(nèi)存大小建立一個空閑分區(qū)節(jié)點記錄該動態(tài)內(nèi)存的信息,真正意義上實現(xiàn)了動態(tài)分配。

(2)用戶不必在系統(tǒng)啟動時初始化動態(tài)內(nèi)存區(qū),對外接口函數(shù)只有pvPortMalloc和vPortFree,很大程度上降低了使用動態(tài)內(nèi)存的難度。

(3)系統(tǒng)采用首次適應(yīng)算法減小了分配和回收動態(tài)內(nèi)存時的查找時間。

同樣,該策略也存在著如下缺點:

(1)每次分配和回收動態(tài)內(nèi)存的時間不固定,即存在著時間不確定性。

(2)如果用戶程序需要頻繁分配和回收大小不同的動態(tài)內(nèi)存塊時,隨著系統(tǒng)運(yùn)行,可能會出現(xiàn)空閑分區(qū)鏈表越來越大,整個動態(tài)內(nèi)存分區(qū)會被分割成很多個細(xì)小的內(nèi)存碎片,且每一個內(nèi)存碎片都附帶一個空閑分區(qū)節(jié)點,造成內(nèi)存空間的大量浪費(fèi)。

(3)一旦出現(xiàn)(2)所述的現(xiàn)象,整個系統(tǒng)的穩(wěn)定性將會降低,甚至?xí)l(fā)系統(tǒng)的崩潰,盡管這種情況并不是開發(fā)人員編程邏輯算法錯誤造成的,但是FreeRTOS并沒提供方法或者試圖去阻止這種情況發(fā)生。

(4)FreeRTOS在回收內(nèi)存時同樣沒有檢查用戶程序所釋放內(nèi)存塊的合法性,這是因為FreeRTOS采用從小到大排列空閑分區(qū)塊,這樣便找不到一種很好的算法去判別所釋放內(nèi)存塊是否屬于動態(tài)內(nèi)存區(qū)和該動態(tài)內(nèi)存塊結(jié)構(gòu)有沒有遭到破壞。

策略三只是對標(biāo)準(zhǔn)malloc()和free()函數(shù)線程安全方面的進(jìn)行包裝。具體做法是當(dāng)用戶程序調(diào)用pvPortMalloc申請動態(tài)內(nèi)存的時候,暫停系統(tǒng)任務(wù)調(diào)度,將pvPortMalloc的參數(shù)傳給malloc函數(shù),最后開啟任務(wù)調(diào)度,并將malloc返回值傳遞給用戶程序,在釋放內(nèi)存時調(diào)用vPortFree所做步驟也是一樣的。

3 結(jié)論(Conclusion)

通過對μC/OS與FREERTOS兩個常用小型嵌入式操作系統(tǒng)內(nèi)存管理機(jī)制的分析與比較可知:μC/OS動態(tài)內(nèi)存管理機(jī)制將系統(tǒng)實時性和可靠性放在第一位,甚至犧牲了內(nèi)存空間和動態(tài)內(nèi)存分配的靈活性以換取絕對確定的分配和回收時間,如果產(chǎn)品實時性和可靠性要求很高,有足夠內(nèi)存空間可供使用,對于動態(tài)內(nèi)存分配情況在設(shè)計初始便能確定的情況下,μC/OS動態(tài)內(nèi)存管理機(jī)制便是首選了;反之如果用戶程序?qū)討B(tài)內(nèi)存分配和回收情況無法確定或者所申請大小是隨機(jī)的,由于控制成本導(dǎo)致沒有足夠大內(nèi)存空間可供使用,且要求動態(tài)內(nèi)存管理機(jī)制具備很高的靈活性,這樣便只能選擇實時性和可靠性相對不足的FreeRTOS系統(tǒng)。

本文以μC/OS與FREERTOS兩種操作系統(tǒng)為例,在深入研究其動態(tài)內(nèi)存管理機(jī)制的基礎(chǔ)上,對其優(yōu)缺點和適用場合進(jìn)行了分析比較,說明了產(chǎn)品軟件設(shè)計階段動態(tài)內(nèi)存分配機(jī)制的選擇在一定程度上左右著整個系統(tǒng)的成本和性能,在低成本嵌入式產(chǎn)品中使用到動態(tài)內(nèi)存,必須根據(jù)產(chǎn)品的實際情況選擇合適的動態(tài)內(nèi)存管理算法,便于軟件開發(fā)人員在實際應(yīng)用中根據(jù)產(chǎn)品不同需求進(jìn)行針對性的選擇。

參考文獻(xiàn)(References)

[1] Lu Xiao-shuang,Shuai Jian-mei,Wu Qing-xiang.Novel memory manager for object-oriented programs[J].Computer Engineering,2012,38(9):21-23.

[2] Zhang Fei.The dynamic memory management research of real-time embedded operating system[D].Hefei:University of Science and Technology of China,2011.

[3] Gao Chao,Han Rui,Ni Hong.Memory management solution in embedded linxux systems[J].Journal of Chinese Computer Systems,2011,32(4):614-618.

[4] 黃鵬程.嵌入式實時操作系統(tǒng)FreeRTOS在ARM7上移植的實現(xiàn)[J].中國電子商情:通信市場,2009(3):59-64.

[5] 張龍彪,張果.嵌入式操作系統(tǒng)FreeRTOS的原理與移植實現(xiàn)[J].信息技術(shù),2012(11):31-34.

[6] Richard Barry.USING THE FREERTOS REAL TIME KERNEL[M].2009.

[7] 劉濱,等.嵌入式操作系統(tǒng)FreeRTOS的原理與實現(xiàn)[J].單片機(jī)與嵌入式應(yīng)用,2005(7):8-11.

[8] 陶銳,等.基于ARM7內(nèi)核的UCoS-Ⅱ移植研究[J].企業(yè)技術(shù)開發(fā):中旬刊,2012(2):68;74.

作者簡介:

肖 蕾(1974-),男,博士,副教授.研究領(lǐng)域:嵌入式系統(tǒng),自動化測控技術(shù).

劉克江(1989-),男,本科.研究領(lǐng)域:嵌入式系統(tǒng).

猜你喜歡
管理機(jī)制
試論工程造價管理機(jī)制的完善與創(chuàng)新
建立有效的管理機(jī)制奠定堅實的人力資源基礎(chǔ)
關(guān)于軟科學(xué)質(zhì)量管理機(jī)制的問題探討
工電道岔結(jié)合部聯(lián)合管理機(jī)制的探討
淺析WSN的網(wǎng)絡(luò)安全管理機(jī)制
基于ECC的智能家居密鑰管理機(jī)制的實現(xiàn)
安全計算機(jī)通信管理機(jī)制的形式化驗證與實現(xiàn)
煤炭企業(yè)倉儲管理機(jī)制探索和研究
建立完善的保障性住房管理機(jī)制探討
企業(yè)內(nèi)部控制的風(fēng)險管理機(jī)制分析
主站蜘蛛池模板: 欧美激情成人网| 九九精品在线观看| 国产综合网站| 成人日韩精品| 91福利片| 69av免费视频| 亚洲男人的天堂网| 最新亚洲人成网站在线观看| 国内精品久久九九国产精品| 免费Aⅴ片在线观看蜜芽Tⅴ| 国产凹凸一区在线观看视频| jizz在线免费播放| 夜夜操国产| 欧美乱妇高清无乱码免费| 亚洲一区波多野结衣二区三区| 精品一区二区三区水蜜桃| 日韩福利在线视频| 国产成人一区二区| 欧美成人精品高清在线下载| 亚洲制服丝袜第一页| 中文字幕在线不卡视频| 欧美日韩中文国产| 亚洲天堂2014| 久久综合色天堂av| 成人字幕网视频在线观看| 日韩精品成人网页视频在线| 久一在线视频| 经典三级久久| a毛片在线播放| 婷婷丁香色| 欧美日韩专区| 日韩黄色在线| 欧美视频二区| 欧美精品亚洲精品日韩专区| 国产精品一线天| 国产精品白浆无码流出在线看| 国产亚洲精品97AA片在线播放| 日本黄色不卡视频| 第一页亚洲| 免费全部高H视频无码无遮掩| 91在线播放国产| 在线日韩日本国产亚洲| 福利在线不卡| 日本道中文字幕久久一区| 国产无码在线调教| 国产乱子伦精品视频| 欧美亚洲一二三区| 国产鲁鲁视频在线观看| 在线另类稀缺国产呦| 精品三级网站| 亚州AV秘 一区二区三区| 日韩高清欧美| 国产一级毛片yw| 欧美v在线| 亚洲男人的天堂在线| 国产一级无码不卡视频| 2048国产精品原创综合在线| 国产黄色片在线看| 中文无码日韩精品| 日本午夜精品一本在线观看| h网址在线观看| 国产精彩视频在线观看| 激情六月丁香婷婷四房播| 色婷婷在线影院| 国产成人一区免费观看| 久久婷婷色综合老司机| 国产一区自拍视频| 亚洲欧美成人综合| 精品少妇人妻一区二区| 黑色丝袜高跟国产在线91| 国产精品观看视频免费完整版| 欧美中出一区二区| 欧美国产精品拍自| 999国内精品久久免费视频| 亚洲无码高清视频在线观看| 欧美不卡视频一区发布| 日韩在线成年视频人网站观看| 欧美成人怡春院在线激情| 国产成人永久免费视频| 国产精品视频猛进猛出| 欧美一级片在线| 福利在线不卡一区|