一種嵌入式系統的內存分配方案
4.2 TMS中的內存分配
TMS是WindRiver公司為可管理式交換機推出的開發包。它用用IDB來管理各種協議的數據,比如STP和GVRP等。為了支持IDB,它建立了自己的緩沖池管理方案,程序在 bufPoolLib.c中。該程序包含用于緩沖池管理的函數,這些函數允許從1個池中分配固定數目和大小的緩沖區。通過預先分配一定數目固定大小的緩沖區,避免了反復的小的內存塊分配/釋放相關聯的內存碎片和浪費。既然它從1個單一的塊中分配緩沖池,也比對每一個緩沖區執行1 次分配有更高的空間效率。模塊對每個緩沖區加上1個標記(MAGIC),釋放時會檢查標記。模塊給用戶提供分配和釋放操作定義回調函數的能力。這樣可以做到自動的對象創建和解構,同時允許由多個緩沖池分配的成員組成的對象做為1個單一的實體刪除。這類似于C++中自動的對象構建和解構,不過是用C語言并且沒有堆棧分配的負擔。模塊既允許從堆棧中分配緩沖池(通過calloc),也可以在用戶分配的空間中創建它們。模塊用1個單向鏈表來維護未分配的緩沖區,但不跟蹤已分配的緩沖區。模塊并不是任務安全的,用戶需要用信號時來保護緩沖池。
(1)緩沖池結構 typedef struct { ulong_t magic; /*用于一致性檢測的特殊標記*/ Boolean localAlloc; /*內存是否在創建緩沖區時分配*/ SL_LIST freeList; /*空閑鏈表*/ Void store; /*緩沖區指向的內存指針*/ STATUS(*createFn)(void*,ulong_t argl); /*創建緩沖區時的回調函數指針*/ STATUS(*destroyFn)(void*,ulong_targl);/*釋放緩沖區時的回調函數指針*/ Ulong_t argVal;/*回調函數的參數*/ } buf_pool_t; 結構中的參數包括檢查標記MAGIC、是否本地分配、空閑鏈表、內存指針、創建緩沖池的回調函數指針、釋放時的回調函數指針、回調函數參數。
(2)相關函數
◆BufPoolInitializeStorage:分配和初始化存儲區。參數包括存儲區地址(如為NULL,則本地分配)、緩沖區大小、緩沖區個數。
①根據緩沖區大小和個數獲得所需的內存大小。
②如果指針為NULL,則調用calloc分配內存。設置本地分配標志。
③初始化內存為0。
④初始化指針。分配的內存塊最前面為緩沖池結構buf_pool_t。實際的存儲區緊隨其后。Buf_pool_t包含參數檢查標記、是否本地分配、存儲區地址、分配時回調函數、釋放時回調函數、回調函數變量。此時只設置存儲區指針。
◆BufPoolCreate:創建緩沖池。參數為內存制止。緩沖區尺寸和個數,創建時回調函數、釋放時回調函數、回調函數參數。
①尺寸對齊。
②調用bufPoolInitializeStorage初始化內存區和buf_pool_t結構。
③用傳入參數填充buf_pool_t結構。 ④將緩沖區添加到空閑鏈表中,最后的緩沖區在最前面。
◆BufPoolDestroy:刪除緩沖池。參數為buf_pool_t指針。
①檢查緩沖池結構中的MAGIC字段是否被個性。
②如果是本地分配的則翻放內存區。
◆BufPoolAlloc:從緩沖池中分配一個緩沖區,參數為緩沖池結構指針。如果存在空閑緩沖區,則從空閑鏈表中除并提供給調用者,執行創建時回調函數。如果回調函數返回錯誤,則將緩沖區返還給空閑鏈表。
①檢查緩沖池結構中的MAGIC標記是否完好。
②從空閑鏈表中取出頭一個節點。
③如果節點不為空,清空節點,以其地址為參數調用回調函數。
④如果回調函數返回錯誤,則將節點還給空閑鏈表。 ⑤返回得到空閑緩沖區地址。
◆BufPoolFree:將緩沖區返回給緩沖池。如果定義了回調函數,將在歸還緩沖之間調用回調函數。參數為緩沖池結構和緩沖區指針。
①緩沖池MAGIC標記是否完好。
②如果定義回調函數、調用之。如果返回錯誤,則設置錯誤號。
③將緩沖區添加到空閑鏈表中頭部。
注意該函數有2點:
①回調函數返回錯誤,照樣歸還緩沖區。
②沒有檢查緩沖區是否二次釋放,這一點與Intel的驅動程序不同。 另外,TMS的緩沖池沒有BLOCK要領,不需要判斷哪個CELL屬于哪個BLOCK,簡化 了操作。
5 小結
許多嵌入式應用在RTOS提供的malloc/free的基礎上編寫自己的內存管理方案。編寫這樣的內存管理方案,目的無非有兩個:一是減少對 malloc/free的依賴,從而避免由之帶來的內存碎片、時間不確定等總是;另一個是增強程序的查錯能力,送還內存使用錯誤。對于在嵌入式系統中廣泛存在的數據庫類型的內存需求,即分配多個固定尺寸的內存單元的要求,“一閃分配,多次使用”的方案無疑是一種很好的解決之道。文中介紹的2個例子很好地體現了它的優越性。
評論