新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 一種嵌入式系統(tǒng)的內存分配方案

一種嵌入式系統(tǒng)的內存分配方案

作者: 時間:2016-09-12 來源:網(wǎng)絡 收藏

4.2 TMS中的

TMS是WindRiver公司為可管理式交換機推出的開發(fā)包。它用用IDB來管理各種協(xié)議的數(shù)據(jù),比如STP和GVRP等。為了支持IDB,它建立了自己的緩沖池管理,程序在 bufPoolLib.c中。該程序包含用于緩沖池管理的函數(shù),這些函數(shù)允許從1個池中分配固定數(shù)目和大小的緩沖區(qū)。通過預先分配一定數(shù)目固定大小的緩沖區(qū),避免了反復的小的內存塊分配/釋放相關聯(lián)的內存碎片和浪費。既然它從1個單一的塊中分配緩沖池,也比對每一個緩沖區(qū)執(zhí)行1 次分配有更高的空間效率。模塊對每個緩沖區(qū)加上1個標記(MAGIC),釋放時會檢查標記。模塊給用戶提供分配和釋放操作定義回調函數(shù)的能力。這樣可以做到自動的對象創(chuàng)建和解構,同時允許由多個緩沖池分配的成員組成的對象做為1個單一的實體刪除。這類似于C++中自動的對象構建和解構,不過是用C語言并且沒有堆棧分配的負擔。模塊既允許從堆棧中分配緩沖池(通過calloc),也可以在用戶分配的空間中創(chuàng)建它們。模塊用1個單向鏈表來維護未分配的緩沖區(qū),但不跟蹤已分配的緩沖區(qū)。模塊并不是任務安全的,用戶需要用信號時來保護緩沖池。

(1)緩沖池結構 typedef struct { ulong_t magic; /*用于一致性檢測的特殊標記*/ Boolean localAlloc; /*內存是否在創(chuàng)建緩沖區(qū)時分配*/ SL_LIST freeList; /*空閑鏈表*/ Void store; /*緩沖區(qū)指向的內存指針*/ STATUS(*createFn)(void*,ulong_t argl); /*創(chuàng)建緩沖區(qū)時的回調函數(shù)指針*/ STATUS(*destroyFn)(void*,ulong_targl);/*釋放緩沖區(qū)時的回調函數(shù)指針*/ Ulong_t argVal;/*回調函數(shù)的參數(shù)*/ } buf_pool_t; 結構中的參數(shù)包括檢查標記MAGIC、是否本地分配、空閑鏈表、內存指針、創(chuàng)建緩沖池的回調函數(shù)指針、釋放時的回調函數(shù)指針、回調函數(shù)參數(shù)。

(2)相關函數(shù)

◆BufPoolInitializeStorage:分配和初始化存儲區(qū)。參數(shù)包括存儲區(qū)地址(如為NULL,則本地分配)、緩沖區(qū)大小、緩沖區(qū)個數(shù)。

①根據(jù)緩沖區(qū)大小和個數(shù)獲得所需的內存大小。

②如果指針為NULL,則調用calloc分配內存。設置本地分配標志。

③初始化內存為0。

④初始化指針。分配的內存塊最前面為緩沖池結構buf_pool_t。實際的存儲區(qū)緊隨其后。Buf_pool_t包含參數(shù)檢查標記、是否本地分配、存儲區(qū)地址、分配時回調函數(shù)、釋放時回調函數(shù)、回調函數(shù)變量。此時只設置存儲區(qū)指針。

◆BufPoolCreate:創(chuàng)建緩沖池。參數(shù)為內存制止。緩沖區(qū)尺寸和個數(shù),創(chuàng)建時回調函數(shù)、釋放時回調函數(shù)、回調函數(shù)參數(shù)。

①尺寸對齊。

②調用bufPoolInitializeStorage初始化內存區(qū)和buf_pool_t結構。

③用傳入?yún)?shù)填充buf_pool_t結構。 ④將緩沖區(qū)添加到空閑鏈表中,最后的緩沖區(qū)在最前面。

◆BufPoolDestroy:刪除緩沖池。參數(shù)為buf_pool_t指針。

①檢查緩沖池結構中的MAGIC字段是否被個性。

②如果是本地分配的則翻放內存區(qū)。

◆BufPoolAlloc:從緩沖池中分配一個緩沖區(qū),參數(shù)為緩沖池結構指針。如果存在空閑緩沖區(qū),則從空閑鏈表中除并提供給調用者,執(zhí)行創(chuàng)建時回調函數(shù)。如果回調函數(shù)返回錯誤,則將緩沖區(qū)返還給空閑鏈表。

①檢查緩沖池結構中的MAGIC標記是否完好。

②從空閑鏈表中取出頭一個節(jié)點。

③如果節(jié)點不為空,清空節(jié)點,以其地址為參數(shù)調用回調函數(shù)。

④如果回調函數(shù)返回錯誤,則將節(jié)點還給空閑鏈表。 ⑤返回得到空閑緩沖區(qū)地址。

◆BufPoolFree:將緩沖區(qū)返回給緩沖池。如果定義了回調函數(shù),將在歸還緩沖之間調用回調函數(shù)。參數(shù)為緩沖池結構和緩沖區(qū)指針。

①緩沖池MAGIC標記是否完好。

②如果定義回調函數(shù)、調用之。如果返回錯誤,則設置錯誤號。

③將緩沖區(qū)添加到空閑鏈表中頭部。

注意該函數(shù)有2點:

①回調函數(shù)返回錯誤,照樣歸還緩沖區(qū)。

②沒有檢查緩沖區(qū)是否二次釋放,這一點與Intel的驅動程序不同。 另外,TMS的緩沖池沒有BLOCK要領,不需要判斷哪個CELL屬于哪個BLOCK,簡化 了操作。

5 小結

許多應用在RTOS提供的malloc/free的基礎上編寫自己的內存管理。編寫這樣的內存管理,目的無非有兩個:一是減少對 malloc/free的依賴,從而避免由之帶來的內存碎片、時間不確定等總是;另一個是增強程序的查錯能力,送還內存使用錯誤。對于在系統(tǒng)中廣泛存在的數(shù)據(jù)庫類型的內存需求,即分配多個固定尺寸的內存單元的要求,“一閃分配,多次使用”的方案無疑是一種很好的解決之道。文中介紹的2個例子很好地體現(xiàn)了它的優(yōu)越性。


上一頁 1 2 3 下一頁

評論


相關推薦

技術專區(qū)

關閉