<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 一種嵌入式系統(tǒng)的內(nèi)存分配方案

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

          作者: 時(shí)間:2016-09-12 來(lái)源:網(wǎng)絡(luò) 收藏

          4.2 TMS中的

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

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

          (2)相關(guān)函數(shù)

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

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

          ②如果指針為NULL,則調(diào)用calloc分配內(nèi)存。設(shè)置本地分配標(biāo)志。

          ③初始化內(nèi)存為0。

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

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

          ①尺寸對(duì)齊。

          ②調(diào)用bufPoolInitializeStorage初始化內(nèi)存區(qū)和buf_pool_t結(jié)構(gòu)。

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

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

          ①檢查緩沖池結(jié)構(gòu)中的MAGIC字段是否被個(gè)性。

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

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

          ①檢查緩沖池結(jié)構(gòu)中的MAGIC標(biāo)記是否完好。

          ②從空閑鏈表中取出頭一個(gè)節(jié)點(diǎn)。

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

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

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

          ①緩沖池MAGIC標(biāo)記是否完好。

          ②如果定義回調(diào)函數(shù)、調(diào)用之。如果返回錯(cuò)誤,則設(shè)置錯(cuò)誤號(hào)。

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

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

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

          ②沒(méi)有檢查緩沖區(qū)是否二次釋放,這一點(diǎn)與Intel的驅(qū)動(dòng)程序不同。 另外,TMS的緩沖池沒(méi)有BLOCK要領(lǐng),不需要判斷哪個(gè)CELL屬于哪個(gè)BLOCK,簡(jiǎn)化 了操作。

          5 小結(jié)

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


          上一頁(yè) 1 2 3 下一頁(yè)

          關(guān)鍵詞: 嵌入式 內(nèi)存分配 方案

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();