UCOSⅡ的內(nèi)存管理模塊_第1頁(yè)
UCOSⅡ的內(nèi)存管理模塊_第2頁(yè)
UCOSⅡ的內(nèi)存管理模塊_第3頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、UCOS_II的內(nèi)存管理模塊內(nèi)存管理模塊主要由一個(gè)數(shù)據(jù)結(jié)構(gòu)體和五個(gè)函數(shù)組成:內(nèi)存控制塊數(shù)據(jù)結(jié)構(gòu)OS_MEM內(nèi)存分區(qū)建立函數(shù)OSMemCreate ()內(nèi)存塊分配函數(shù)OSMemGet ()內(nèi)存塊釋放函數(shù)OSMemPut ()內(nèi)存分區(qū)狀態(tài)查詢函數(shù)OSMemQuery ()內(nèi)存控制塊鏈表初始化函數(shù)OSMemlnit ()他們一同構(gòu)成內(nèi)存管理模塊來(lái)對(duì)需要管理的內(nèi)存塊進(jìn)行簡(jiǎn)單的管理-分配(動(dòng)態(tài)分配)和 釋放(動(dòng)態(tài)回收);內(nèi)存控制塊數(shù)據(jù)結(jié)構(gòu)OS_MEMtypedef struct void *OSMemAddr;void *OSMemFreeList;INT32U OSMemBlkSize;INT32U

2、OSMemNBlks;INT32U OSMemNFree; OS_MEM;系統(tǒng)中每個(gè)內(nèi)存分區(qū)必須有一個(gè)屬于自己的內(nèi)存控制塊,只有這樣,內(nèi)存管理模塊中的五個(gè) 函數(shù)才能對(duì)這個(gè)內(nèi)存分區(qū)進(jìn)行管理和操作;操作系統(tǒng)首先在內(nèi)存中聲明了一個(gè)全局的內(nèi)存控制塊數(shù)組和指針:static OS_MEM *OSMemFreeList;static OS_MEM OSMemTblOS_MAX_MEM_PART;然后在系統(tǒng)初始化的時(shí)候調(diào)用內(nèi)存控制塊鏈表初始化函數(shù)把這個(gè)全局的內(nèi)存控制塊數(shù)組OSMemTbl構(gòu)建成一個(gè)單向鏈表,并把這個(gè)鏈表的頭指針賦給OSMemFreeList,這樣以后, 每當(dāng)用內(nèi)存分區(qū)建立函數(shù)OSMemCre

3、ate ()建立一個(gè)分區(qū)時(shí),從這個(gè)鏈表中取出一個(gè)內(nèi)存控 制塊來(lái)對(duì)這個(gè)內(nèi)存分區(qū)進(jìn)行管理;內(nèi)存控制塊數(shù)組的大小決定系統(tǒng)中內(nèi)存分區(qū)的最大數(shù) 目;內(nèi)存分區(qū)建立函數(shù)OSMemCreate ()要建立一個(gè)內(nèi)存分區(qū),必須具備三個(gè)條件:有供建立內(nèi)存分區(qū)的內(nèi)存空間:一般處理方法是以二維數(shù)組的形式來(lái)聲明一個(gè)變量,這 個(gè)變量在編譯、鏈接的時(shí)候必定分配給一定的內(nèi)存空間,這個(gè)內(nèi)存空間只能通過(guò)內(nèi)存塊分配 函數(shù)來(lái)獲取使用;內(nèi)存控制塊數(shù)組中有閑置的內(nèi)存控制塊:一般的處理方法是先統(tǒng)計(jì)需要建立的內(nèi)存分區(qū) 的數(shù)目,然后依此來(lái)聲明足夠的內(nèi)存控制塊;聲明一個(gè)內(nèi)存控制塊指針,便于以后對(duì)這個(gè)內(nèi)存分區(qū)的訪問(wèn);內(nèi)存分區(qū)建立后,這個(gè)二維數(shù)組就被

4、構(gòu)建成了一個(gè)單向鏈表,每個(gè)節(jié)點(diǎn)就是一個(gè)內(nèi)存塊,它 由兩部分組成:指向下一個(gè)內(nèi)存塊的指針(不能用來(lái)作為動(dòng)態(tài)內(nèi)存來(lái)使用)、能夠作為動(dòng)態(tài) 內(nèi)存來(lái)使用的存儲(chǔ)空間;內(nèi)存塊分配函數(shù)OSMemGet ()用戶創(chuàng)建的任務(wù)要使用內(nèi)存分區(qū)中的內(nèi)存塊,就必須通過(guò)調(diào)用內(nèi)存分配函數(shù)來(lái)申請(qǐng);一般的 處理方法是:先在用戶任務(wù)中聲明一個(gè)void類(lèi)型的指針和一個(gè)INTU8型變量,然后調(diào)用 OSMemGet ()來(lái)從指定的內(nèi)存分區(qū)中申請(qǐng)一個(gè)內(nèi)存塊,并把內(nèi)存塊的指針賦給預(yù)先聲明的 void類(lèi)型指針;接著對(duì)INTU8型變量進(jìn)行判斷,看申請(qǐng)內(nèi)存塊是否成功。如果成功,就可以 使用這個(gè)內(nèi)存塊中可以用動(dòng)態(tài)使用的存儲(chǔ)空間。內(nèi)存塊釋放函數(shù)OSM

5、emPut ()用戶創(chuàng)建的任務(wù)不在使用申請(qǐng)來(lái)的內(nèi)存塊的時(shí)候,必須及時(shí)的調(diào)用OSMemPut ()來(lái)把內(nèi)存塊 釋放到相應(yīng)的內(nèi)存分區(qū)中去。需要注意的是,這個(gè)內(nèi)存塊從那個(gè)內(nèi)存分區(qū)中申請(qǐng)來(lái)的就必須 釋放到那個(gè)內(nèi)存分區(qū)中去,否則會(huì)造成系統(tǒng)崩潰;這個(gè)用戶在編寫(xiě)任務(wù)的時(shí)候注意就可以避 免了;OSMemGet ()和OSMemPut ()應(yīng)該成對(duì)使用;內(nèi)存分區(qū)狀態(tài)查詢函數(shù)OSMemQuery ()調(diào)用內(nèi)存分區(qū)狀態(tài)查詢函數(shù)可以獲取一個(gè)內(nèi)存分區(qū)的相關(guān)信息,它的實(shí)現(xiàn)方法就是把內(nèi)存分 區(qū)控制塊中的信息拷貝到OS_MEM_DATA的數(shù)據(jù)結(jié)構(gòu)體中供調(diào)用查看、使用;那么大家也許會(huì) 問(wèn)為什么我們不直接通過(guò)訪問(wèn)分區(qū)控制塊來(lái)獲取

6、這個(gè)分區(qū)的使用信息呢?這就涉及到代碼的 臨界區(qū)的問(wèn)題。試想如果我們直接訪問(wèn)內(nèi)存控制塊中的域的話而沒(méi)有關(guān)中斷的話,那么如果 時(shí)鐘節(jié)拍到來(lái)的時(shí)候我們的訪問(wèn)肯定被打斷(我們只獲取了內(nèi)存分區(qū)的部分信息,還有部分 信息沒(méi)來(lái)得及獲取),這個(gè)時(shí)候通過(guò)調(diào)度準(zhǔn)備就緒而且優(yōu)先級(jí)高的任務(wù)得以運(yùn)行,那么前面 的任務(wù)就得等待;試想現(xiàn)在運(yùn)行的任務(wù)如果對(duì)這個(gè)內(nèi)存分區(qū)進(jìn)行操作的話,那么上一個(gè)任務(wù) 獲取的內(nèi)存分區(qū)的信息就不一致了,這個(gè)可能給我們不可預(yù)測(cè)的后果;為此在訪問(wèn)內(nèi)存分區(qū) 控制塊前,我們得關(guān)中斷,之后我們還得開(kāi)中斷,這個(gè)給我們的移值帶來(lái)瑣碎的麻煩!這也 就是編寫(xiě)這個(gè)函數(shù)的原因!下面就內(nèi)存管理模塊來(lái)舉個(gè)例子:#define

7、 BlockNum 100#define BlockSize 32OS_MEM *CommRAMA_Ptr;OS_MEM *CommRAMB_Ptr;INT8U CommRAMABlockNumBlockSize;INT8U CommRAMBBlockNumBlockSize*4; void main (void)INT8U error; /*用內(nèi)存分區(qū)建立函數(shù)OSMemCreate ()把這兩塊RAM存儲(chǔ)空間構(gòu)建成內(nèi)存*/*區(qū),并把管理這兩塊內(nèi)存分區(qū)的內(nèi)存分區(qū)控制塊的地址賦給兩個(gè)OS_MEM指針*/CommRAMA_Ptr=OSMemCreate (CommRAMA,BlockNum, Bl

8、ockSize,error);CommRAMB_Ptr=OSMemCreate (CommRAMB,BlockNum, BlockSize*2, error)OSStart ();void MyTask (void)INT8U Error;OS_MEM_DATA MemlnfoINT8U BlkA_Ptr, BlkB_Ptr; for (;) TOC o 1-5 h z Error= OSMemQuery (CommRAMA_Ptr, &Memlnfo); (1)If (MemInfo.OSNFree2) (2)BlkA_Ptr= (INT8U *) OSMemGet (CommRAMA_Pt

9、r,&Error); (3)BlkB_Ptr= (INT8U *) OSMemGet (CommRAMA_Ptr,&Error); (4)/*使用獲得的內(nèi)存塊*/ /*釋放獲得的內(nèi)存塊*/OSMemPut (CommRAMA_Ptr, BlkA_Ptr);OSMemPut (CommRAMA_Ptr, BlkB_Ptr); else Error= OSMemQuery (CommRAMB_Ptr, &MemInfo);If (Memlnfo.OSNFree1) BlkA_Ptr= (INT8U *) OSMemGet (CommRAMB_Ptr,&Error); - (5)/*使用獲得的內(nèi)存塊

10、*/ /*釋放獲得的內(nèi)存塊*/OSMemPut (CommRAMA_Ptr, BlkB_Ptr); else OSTimeDly (1);/*等待一個(gè)時(shí)鐘節(jié)拍*/ 系統(tǒng)建立了兩個(gè)內(nèi)存分區(qū):內(nèi)存分區(qū)CommRAMA的內(nèi)存塊的大小為32個(gè)INT8U (可用的為31個(gè)INT8U),內(nèi)存分區(qū)CommRAMB的內(nèi)存塊的大小為128個(gè)INT8U (可用的為127個(gè)INT8U);現(xiàn)在 用戶創(chuàng)建了一個(gè)名為MyTask的任務(wù),它運(yùn)行時(shí)需要一個(gè)大小為60個(gè)INT8U的內(nèi)存空間,在這 個(gè)系統(tǒng)有兩個(gè)解決辦法:從內(nèi)存分區(qū)CommRAMA中申請(qǐng)兩個(gè)內(nèi)存塊以及從內(nèi)存分區(qū)CommRAMB中 申請(qǐng)一個(gè)內(nèi)存塊;具體的實(shí)現(xiàn)方法是先獲取內(nèi)存分區(qū)CommRAMA的使用信息,看有沒(méi)有足夠的 內(nèi)存塊(剩余塊數(shù)不小于2)如果夠的話,就不用從內(nèi)存分區(qū)CommRAMB中申請(qǐng)了,否則就的 從C

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論