新聞中心

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

        一種嵌入式系統的內存分配方案

        作者: 時間:2016-09-12 來源:網絡 收藏

        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個例子很好地體現了它的優越性。


        上一頁 1 2 3 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 宜兰市| 遂溪县| 南昌市| 榆树市| 南澳县| 拜城县| 霍城县| 科技| 务川| 濮阳县| 河曲县| 永顺县| 峨眉山市| 岳阳县| 松潘县| 乌兰浩特市| 昌江| 垣曲县| 中山市| 罗江县| 隆尧县| 梨树县| 襄汾县| 木兰县| 闽侯县| 蓬莱市| 嘉荫县| 伊金霍洛旗| 旌德县| 张北县| 射洪县| 内黄县| 绥芬河市| 玉田县| 德安县| 伊吾县| 新乡市| 马关县| 延庆县| 神农架林区| 沽源县|