西安電子科技大學(xué)嵌入式實(shí)時(shí)操作系統(tǒng)課件 第9章_第1頁(yè)
西安電子科技大學(xué)嵌入式實(shí)時(shí)操作系統(tǒng)課件 第9章_第2頁(yè)
西安電子科技大學(xué)嵌入式實(shí)時(shí)操作系統(tǒng)課件 第9章_第3頁(yè)
西安電子科技大學(xué)嵌入式實(shí)時(shí)操作系統(tǒng)課件 第9章_第4頁(yè)
西安電子科技大學(xué)嵌入式實(shí)時(shí)操作系統(tǒng)課件 第9章_第5頁(yè)
已閱讀5頁(yè),還剩55頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第9章內(nèi)存管理9.1概述

9.2建立內(nèi)存分區(qū)——OSMemCreate()9.3分配內(nèi)存塊——OSMemGet()

9.4釋放內(nèi)存塊——OSMemPut()

9.5查詢(xún)內(nèi)存分區(qū)的狀態(tài)——OSMemQuery()習(xí)題

9.1概述

9.1.1基本原理

在內(nèi)存管理方面,ANSIC本身就提供了malloc()和free()兩個(gè)函數(shù)用于動(dòng)態(tài)地分配內(nèi)存和釋放內(nèi)存。但是,μC/OS-Ⅱ?yàn)槭裁床恢苯永眠@兩個(gè)函數(shù),而要另外構(gòu)建內(nèi)存管理方法呢,其主要原因在于以下兩個(gè)方面:

(1)當(dāng)應(yīng)用程序反復(fù)調(diào)用malloc()和free()函數(shù)進(jìn)行內(nèi)存的分配與釋放時(shí),可能會(huì)將原來(lái)一塊很大且連續(xù)的內(nèi)存區(qū)域逐漸分割成許多細(xì)小而彼此不相鄰的內(nèi)存區(qū)域,產(chǎn)生通常說(shuō)的內(nèi)存碎片。當(dāng)內(nèi)存碎片大量存在時(shí),最后應(yīng)用程序可能連一塊很小的內(nèi)存也無(wú)法分配到。(2)由于內(nèi)存管理算法的原因,malloc()和free()函數(shù)的執(zhí)行時(shí)間是不確定的,因此不適合作實(shí)時(shí)操作系統(tǒng)函數(shù)應(yīng)用。

μC/OS-Ⅱ操作系統(tǒng)的內(nèi)存管理方法是在解決了malloc()和free()兩函數(shù)缺陷的基礎(chǔ)上構(gòu)建起來(lái)的。其原理如圖9.1所示,將內(nèi)存分區(qū)分塊,也就是把連續(xù)的每個(gè)大塊內(nèi)存分區(qū),圖9.1內(nèi)存分區(qū)每個(gè)分區(qū)又分成整數(shù)個(gè)大小相同的內(nèi)存塊。μC/OS-Ⅱ利用這種新機(jī)制,對(duì)malloc()和free()函數(shù)進(jìn)行了改進(jìn),并構(gòu)建了新的內(nèi)存管理函數(shù),使得它們可以分配和釋放固定大小的內(nèi)存塊。這樣一來(lái),malloc()和free()兩函數(shù)的執(zhí)行時(shí)間不確定的問(wèn)題就首先得到了解決。接下來(lái)就是要解決內(nèi)存碎片的問(wèn)題。如圖9.1所示,在有多個(gè)分區(qū)分塊的內(nèi)存系統(tǒng)中,分配內(nèi)存時(shí),應(yīng)用程序可以從不同的內(nèi)存分區(qū)中得到大小不同的內(nèi)存塊。當(dāng)需要釋放時(shí),特定的內(nèi)存塊再重新放回它以前所屬的內(nèi)存分區(qū)。通過(guò)這樣的內(nèi)存管理算法,內(nèi)存碎片問(wèn)題就得到了解決。9.1.2內(nèi)存管理函數(shù)

如表9.1所示,μC/OS-Ⅱ提供了四種內(nèi)存管理函數(shù),函數(shù)所屬文件是OS_MEM.C。表9.1內(nèi)存管理函數(shù)一覽表9.1.3內(nèi)存管理函數(shù)的配置常量

在使用內(nèi)存管理函數(shù)之前,必須將OS_CFG?.H文件中相應(yīng)的配置常量設(shè)置為0或1,以確定是編譯還是裁剪該函數(shù),其配置常量如表9.2所示。表9.2內(nèi)存管理函數(shù)的配置常量一覽表9.1.4內(nèi)存控制塊

內(nèi)存控制塊(MemoryControlBlocks,MCB)是用于實(shí)現(xiàn)內(nèi)存管理、跟蹤每一個(gè)內(nèi)存分區(qū)的數(shù)據(jù)結(jié)構(gòu),如程序清單9.1所示,每個(gè)內(nèi)存分區(qū)都有它自己的內(nèi)存控制塊。 程序清單9.1內(nèi)存控制塊的數(shù)據(jù)結(jié)構(gòu)

typedefstruct{

void*OSMemAddr; /*指向內(nèi)存分區(qū)起始地址的指針。它在建立內(nèi)存分區(qū)時(shí)被初始化,

此后不能更改(見(jiàn)9.2節(jié)) */

void*OSMemFreeList;/*指向下一個(gè)空閑內(nèi)存控制塊或下一個(gè)空閑內(nèi)存塊的指針,具體含義

要根據(jù)該內(nèi)存分區(qū)是否已經(jīng)建立來(lái)決定(見(jiàn)9.2節(jié)) */INT32UOSMemBlkSize;/*內(nèi)存分區(qū)中內(nèi)存塊的大小,是用戶(hù)在建立該內(nèi)存分區(qū)時(shí)指定的*/

INT32UOSMemNBlks; /*內(nèi)存分區(qū)中總的內(nèi)存塊數(shù)量,是用戶(hù)在建立該內(nèi)存分區(qū)時(shí)指定的*/

INT32UOSMemNFree; /*內(nèi)存分區(qū)中當(dāng)前可以使用的空閑內(nèi)存塊數(shù)量 */

}OS_MEM;如果要使用μC/OS-Ⅱ中的內(nèi)存管理,首先需要將OS_CFG?.H文件中的開(kāi)關(guān)量OS_MEM_EN設(shè)置為1;然后還要設(shè)置OS_MAX_MEM_PART常量,其值至少是2,它決定了系統(tǒng)中的最大分區(qū)數(shù)。這樣,在啟動(dòng)時(shí)μC/OS-Ⅱ就會(huì)通過(guò)OSInit()調(diào)用OSMemInit()來(lái)實(shí)現(xiàn)對(duì)內(nèi)存管理器的初始化。該初始化主要建立一個(gè)如圖9.2所示的空閑內(nèi)存控制塊鏈表,其中OSMemFreeList指針的作用是將空閑內(nèi)存控制塊鏈接成空閑內(nèi)存控制塊鏈表。圖9.2空閑內(nèi)存控制塊鏈表9.2建立內(nèi)存分區(qū)——OSMemCreate()

9.2.1函數(shù)原型

函數(shù)原型如下:

OS_MEM*OSMemCreate(void*addr,INT32Unblks,INT32Ublksize,INT8U*err)

OSMemCreate()函數(shù)用于建立并初始化一塊內(nèi)存區(qū)。要使用內(nèi)存管理函數(shù),必先調(diào)用OSMemCreate()函數(shù)建立內(nèi)存分區(qū)。一個(gè)內(nèi)存區(qū)包含確定數(shù)量和大小的內(nèi)存塊,應(yīng)用程序可以分配這些內(nèi)存塊,并在用完后釋放回內(nèi)存區(qū)。

OSMemCreate()函數(shù)有如下四個(gè)參數(shù):(1)?addr:建立的內(nèi)存區(qū)的起始地址。內(nèi)存區(qū)可以使用靜態(tài)數(shù)組或在初始化時(shí)使用malloc()函數(shù)建立。

(2)?nblks:內(nèi)存塊的數(shù)量。每一個(gè)內(nèi)存區(qū)最少需要定義兩個(gè)內(nèi)存塊。

(3)?blksize:每個(gè)內(nèi)存塊的大小,最少應(yīng)該能夠容納一個(gè)指針。

(4)?err:指向錯(cuò)誤代碼的變量的指針。OSMemCreate()函數(shù)返回的錯(cuò)誤碼可能為下述幾種之一:

①?OS_NO_ERR:內(nèi)存分區(qū)建立成功。

②?OS_MEM_INVALID_ADD:地址指針為空,非法。③?OS_MEM_INVALID_PART:沒(méi)有空閑的內(nèi)存區(qū)。

④?OS_MEM_INVALID_BLKS:沒(méi)有為每一個(gè)內(nèi)存區(qū)建立至少兩個(gè)內(nèi)存塊。

⑤?OS_MEM_INVALID_SIZE:內(nèi)存塊太小,不能容納一個(gè)指針變量。

OSMemCreate()函數(shù)返回指向內(nèi)存控制塊的指針。如果沒(méi)有空閑內(nèi)存區(qū),則OSMemCreate()函數(shù)返回空指針。

函數(shù)的調(diào)用者是任務(wù)或者啟動(dòng)代碼,開(kāi)關(guān)量是OS_MEM_EN。9.2.2源代碼

OSMemCreate()函數(shù)的源代碼如程序清單9.2所示。該函數(shù)的主要工作過(guò)程如下:

(1)條件檢查,確保各種前提條件的滿(mǎn)足。

(2)從空閑內(nèi)存控制塊鏈表中取得一個(gè)內(nèi)存控制塊。

(3)若該空閑內(nèi)存控制塊可用,則將該內(nèi)存分區(qū)內(nèi)的所有內(nèi)存塊用指針鏈接成一個(gè)單向鏈表。因?yàn)樵谶@個(gè)鏈表中,插入和刪除元素都是從頂端開(kāi)始的,所以無(wú)需使用雙向鏈表。

(4)在內(nèi)存分區(qū)的控制塊中填寫(xiě)與該內(nèi)存分區(qū)有關(guān)的內(nèi)容。

(5)最后返回該內(nèi)存控制塊指針,以后的操作都通過(guò)該指針來(lái)實(shí)現(xiàn)。 程序清單9.2OSMemCreate()函數(shù)的源代碼

OS_MEM*OSMemCreate(void*addr,INT32Unblks,INT32Ublksize,INT8U*err)

{

#ifOS_CRITICAL_METHOD=?=3

OS_CPU_SRcpu_sr;

#endif

OS_MEM *pmem;

INT8U *pblk;

void **plink;INT32U i;

#ifOS_ARG_CHK_EN>0

if(addr =?=(void*)0){ /*確保定義的內(nèi)存分區(qū)起始地址是有效的 */

*err =OS_MEM_INVALID_ADDR;

return((OS_MEM*)0);

}

if(nblks<2){ /*確保每個(gè)內(nèi)存分區(qū)至少有兩個(gè)內(nèi)存塊 */*err=OS_MEM_INVALID_BLKS;

return((OS_MEM*)0);

}

if(blksize<sizeof(void*)){ /*確保每個(gè)內(nèi)存塊至少能容納下一條指針,因?yàn)榭臻e內(nèi)存控制塊是由指針鏈接在一起的 */

*err=OS_MEM_INVALID_SIZE;

return((OS_MEM*)0);

}#endif

OS_ENTER_CRITICAL();

pmem=OSMemFreeList; /*從空閑內(nèi)存控制塊鏈表中取得一個(gè)空閑內(nèi)存控制塊 */

if(OSMemFreeList !=(OS_MEM*)0){ /*確保取得的空閑內(nèi)存控制塊是可用的 */

OSMemFreeList =(OS_MEM*)OSMemFreeList->OSMemFreeList; /*調(diào)整指針 */

}

OS_EXIT_CRITICAL();if(pmem==(OS_MEM*)0){ /*檢查內(nèi)存控制塊是否可用 */

*err=OS_MEM_INVALID_PART;

return((OS_MEM*)0);

}

/*滿(mǎn)足上述條件后,將所要建立的內(nèi)存分區(qū)內(nèi)的所有內(nèi)存塊鏈接成一個(gè)單向鏈表 */

plink=(void**)addr; /*建立單向鏈表 */

pblk=(INT8U*)addr+blksize;

for(i=0;i<(nblks-1);i++){*plink =(void*)pblk;

plink =*plink;

pblk =pblk+blksize;

}

/*在該內(nèi)存分區(qū)控制塊中填寫(xiě)與內(nèi)存分區(qū)有關(guān)的信息 */

*plink =(void*)0;/*最后一條指針指向NULL */

/*在該內(nèi)存分區(qū)控制塊中填寫(xiě)與內(nèi)存分區(qū)有關(guān)的信息 */pmem->OSMemAddr =addr; /*存儲(chǔ)內(nèi)存分區(qū)的起始地址 */

pmem->OSMemFreeList =addr; /*初始化空閑內(nèi)存塊指針 */

pmem->OSMemNFree =nblks; /*存儲(chǔ)內(nèi)存塊的數(shù)量 */

pmem->OSMemNBlks =nblks;

pmem->OSMemBlkSize =blksize; /*存儲(chǔ)每個(gè)內(nèi)存塊的尺寸 */

*err =OS_NO_ERR;

return(pmem);/*返回內(nèi)存控制塊指針,以后對(duì)該內(nèi)存分區(qū)的操作都通過(guò)這個(gè)指針來(lái)實(shí)現(xiàn)*/

}

OSMemCretae()函數(shù)運(yùn)行完畢后,內(nèi)存控制塊所指向的內(nèi)存分區(qū)與分區(qū)中的內(nèi)存塊之間的關(guān)系如圖9.3所示。圖9.3OSMemCretae()函數(shù)建立的內(nèi)存分區(qū)程序一旦運(yùn)行,經(jīng)過(guò)多次分配與釋放內(nèi)存塊后,同一分區(qū)內(nèi)的內(nèi)存塊的鏈接順序會(huì)有很大變化,但這并不影響使用,也不增加時(shí)間開(kāi)銷(xiāo)。

9.2.3范例

建立一個(gè)含有50個(gè)內(nèi)存塊、每個(gè)內(nèi)存塊為16B的內(nèi)存分區(qū),具體代碼如下:OS_MEM*MemBuf; /*定義一個(gè)內(nèi)存控制塊指針 */

INT8Ubuffer[50][16]; /*定義一個(gè)內(nèi)存分區(qū)數(shù)組 */

voidmain(void){

INT8Uerr;

OSInit();

.

MemBuf=OSMemCreate(buffer,50,16,&err);

.

OSStart();

} 9.3分配內(nèi)存塊——OSMemGet()

9.3.1函數(shù)原型

函數(shù)原型如下:

void*OSMemGet(OS_MEM*pmem,INT8U*err)

OSMemGet()函數(shù)用于從已經(jīng)建立的內(nèi)存分區(qū)中申請(qǐng)一個(gè)內(nèi)存塊。該函數(shù)的調(diào)用者可以是任務(wù)或者中斷,開(kāi)關(guān)量是OS_MEM_EN。該函數(shù)有如下兩個(gè)參數(shù):(1)?pmem:指向內(nèi)存控制塊的指針。其值可以在建立內(nèi)存分區(qū)時(shí)得到。

(2)?err:指向包含錯(cuò)誤碼的變量的指針。返回的錯(cuò)誤碼可能為下述幾種之一:

①?OS_NO_ERR:成功得到一個(gè)內(nèi)存塊。

②?OS_MEM_NO_FREE_BLKS:內(nèi)存區(qū)中已經(jīng)沒(méi)有空閑內(nèi)存塊。

③?OS_MEM_INVALID_PMEM:pmem是空指針。

函數(shù)返回指向內(nèi)存區(qū)塊的指針,如果沒(méi)有空間分配給內(nèi)存塊,函數(shù)返回空指針。9.3.2注意事項(xiàng)

調(diào)用OSMemGet()函數(shù)時(shí)應(yīng)注意如下事項(xiàng):

(1)調(diào)用該函數(shù)申請(qǐng)內(nèi)存塊時(shí),用戶(hù)必須知道所建立的內(nèi)存塊的大小,使用時(shí)不能超過(guò)容量。例如,如果一個(gè)內(nèi)存分區(qū)內(nèi)的每個(gè)內(nèi)存塊為64B,那么應(yīng)用程序最多只能使用該內(nèi)存塊中的64B。

(2)用戶(hù)程序必須在使用完內(nèi)存塊后及時(shí)釋放,并重新放回它原先屬于的分區(qū)中去。

(3)函數(shù)可以多次調(diào)用。

(4)如果暫時(shí)沒(méi)有內(nèi)存塊可用,函數(shù)不會(huì)等待,而是立即返回NULL指針,所以可在中斷中調(diào)用。9.3.3源代碼

OSMemGet()函數(shù)的源代碼如程序清單9.3所示。該函數(shù)的主要工作過(guò)程如下:

(1)確保運(yùn)行條件的滿(mǎn)足。

(2)檢查分區(qū)是否有空閑的內(nèi)存塊,若有,則取得它,并作如下操作:因?yàn)橐呀?jīng)從空閑內(nèi)存塊中取走了,所以要將它從空閑內(nèi)存塊鏈表中刪除,并調(diào)整空閑內(nèi)存塊的指針,空閑內(nèi)存塊的數(shù)量也要相應(yīng)減1;若沒(méi)有空閑的內(nèi)存塊,則返回錯(cuò)誤代碼。 程序清單9.3OSMemGet()函數(shù)的源代碼

void*OSMemGet(OS_MEM*pmem,INT8U*err)

{

#ifOS_CRITICAL_METHOD=?=3

OS_CPU_SRcpu_sr;

#endif

void*pblk;

#ifOS_ARG_CHK_EN>0

if(pmem=?=(OS_MEM*)0){ /*確保指針指向的內(nèi)存控制塊是有效的 */*err=OS_MEM_INVALID_PMEM;

return((OS_MEM*)0);

}

#endif

OS_ENTER_CRITICAL();

if(pmem->OSMemNFree>0){ /*檢查分區(qū)中是否有空閑的內(nèi)存塊 */

pblk=pmem->OSMemFreeList; /*如果有,則將第一個(gè)內(nèi)存塊從空閑內(nèi)存塊鏈表中刪除,因?yàn)榇藭r(shí)要使用這個(gè)內(nèi)存控制塊*/pmem->OSMemFreeList=*(void**)pblk; /*調(diào)整空閑內(nèi)存塊鏈表指針 */

pmem->OSMemNFree--; /*空閑內(nèi)存塊數(shù)量減1 */

OS_EXIT_CRITICAL();

*err=OS_NO_ERR; /*申請(qǐng)成功 */

return(pblk); /*將分配到的內(nèi)存塊指針?lè)祷亟o應(yīng)用程序 */}

OS_EXIT_CRITICAL();

*err=OS_MEM_NO_FREE_BLKS; /*如果沒(méi)有空閑內(nèi)存塊,返回錯(cuò)誤代碼 */

return((void*)0); /*返回空指針 */

}

9.3.4范例

OSMemGet()函數(shù)的使用范例如下:OS_MEM*MemBuf; /*定義一個(gè)內(nèi)存控制塊指針 */

voidTask(void*pdata){

INT8U*msg;pdata=pdata;

for(;;){

msg=OSMemGet(MemBuf,&err);

if(msg!=(INT8U*)0){

./*內(nèi)存塊已經(jīng)分配 */

}

}

} 9.4釋放內(nèi)存塊——OSMemPut()

9.4.1函數(shù)原型

函數(shù)原型如下:

INT8UOSMemPut(OS_MEM*pmem,void*pblk)

OSMemPut()函數(shù)用于釋放一個(gè)內(nèi)存塊。開(kāi)關(guān)量是OS_MEM_EN,調(diào)用者是任務(wù)或者中斷。該函數(shù)有如下兩個(gè)參數(shù):

(1)?pmem:指向內(nèi)存控制塊的指針。其值可以在調(diào)用OSMemCreate()函數(shù)建立內(nèi)存分區(qū)的時(shí)候得到。

(2)?pblk:指向?qū)⒁会尫诺膬?nèi)存塊的指針。9.4.2返回值

OSMemPut()函數(shù)的返回值為下述內(nèi)容之一:

(1)?OS_NO_ERR:內(nèi)存塊成功釋放。

(2)?OS_MEM_FULL:內(nèi)存分區(qū)已滿(mǎn),不能再接收釋放的內(nèi)存塊。這種情況說(shuō)明用戶(hù)程序出現(xiàn)了錯(cuò)誤,釋放的內(nèi)存塊多于用OSMemGet()函數(shù)得到的內(nèi)存塊。

(3)?OS_MEM_INVALID_PMEM:pmem是空指針。

(4)?OS_MEM_INVALID_PBLK:pblk是空指針。9.4.3注意事項(xiàng)

調(diào)用OSMemPut()函數(shù)時(shí)應(yīng)注意如下事項(xiàng):

(1)如果一個(gè)內(nèi)存塊已經(jīng)不再使用,必須及時(shí)釋放它,以備其它應(yīng)用程序使用。

(2)釋放內(nèi)存塊時(shí),必須放回到原先申請(qǐng)的內(nèi)存分區(qū)中,不能錯(cuò)放,否則可能導(dǎo)致系統(tǒng)崩潰。例如,從每個(gè)內(nèi)存塊是32B的內(nèi)存分區(qū)中申請(qǐng)了一個(gè)內(nèi)存塊,用完后就不能把它返回給每個(gè)內(nèi)存塊是64B的內(nèi)存分區(qū)。因?yàn)?,?yīng)用程序以后申請(qǐng)64B分區(qū)中的內(nèi)存塊時(shí),可能會(huì)只得到32B的可用空間,而得不到64B的內(nèi)存塊。9.4.4源代碼

OSMemPut()函數(shù)的源代碼如程序清單9.4所示。該函數(shù)的主要工作過(guò)程如下:首先檢查內(nèi)存分區(qū)是否已滿(mǎn),如果已滿(mǎn),則說(shuō)明系統(tǒng)在分配和釋放內(nèi)存時(shí)出現(xiàn)了錯(cuò)誤;如果未滿(mǎn),則將所要釋放的內(nèi)存塊插入到該分區(qū)的空閑內(nèi)存塊鏈表中。最后,將分區(qū)中空閑內(nèi)存塊總數(shù)加1。 程序清單9.4OSMemPut()函數(shù)的源代碼

INT8UOSMemPut(OS_MEM*pmem,void*pblk)

{

#ifOS_CRITICAL_METHOD=?=3

OS_CPU_SRcpu_sr;

#endif

#ifOS_ARG_CHK_EN>0

if(pmem=?=(OS_MEM*)0){ /*確保指針指向的內(nèi)存控制塊是有效的*/return(OS_MEM_INVALID_PMEM);

}

if(pblk=?=(void*)0){ /*確保釋放的內(nèi)存塊是有效的 */

return(OS_MEM_INVALID_PBLK);

}

#endif

OS_ENTER_CRITICAL();

if(pmem->OSMemNFree>=pmem->OSMemNBlks){ /*檢查內(nèi)存分區(qū)是否已滿(mǎn) */OS_EXIT_CRITICAL(); /*若滿(mǎn),則說(shuō)明分配或者釋放內(nèi)存時(shí)出現(xiàn)了錯(cuò)誤 */

return(OS_MEM_FULL);

}

/*內(nèi)存分區(qū)未滿(mǎn) */

*(void**)pblk=pmem->OSMemFreeList;/*將需要釋放的內(nèi)存塊返回給空閑內(nèi)存控制塊鏈表*/pmem->OSMemFreeList=pblk; /*調(diào)整指針,將所釋放的內(nèi)存塊放在鏈表的最前面 */

pmem->OSMemNFree++; /*將分區(qū)中的空閑內(nèi)存塊總數(shù)加1 */

OS_EXIT_CRITICAL();

return(OS_NO_ERR); /*通知調(diào)用者釋放成功 */

}

9.4.5范例

OSMemPut()函數(shù)的使用范例如下:OS_MEM*MemBuf; /*定義一個(gè)內(nèi)存控制塊指針 */

INT8U*MemMsg; /*定義一個(gè)內(nèi)存塊指針 */

voidTask(void*pdata){

INT8Uerr;

pdata=pdata;

for(;;){

err=OSMemPut(MemBuf,(void*)MemMsg);if(err=?=OS_NO_ERR){

. /*處理代碼 */

}

.

}

}9.5查詢(xún)內(nèi)存分區(qū)的狀態(tài)——OSMemQuery()

9.5.1函數(shù)原型

函數(shù)原型如下:

INT8UOSMemQuery(OS_MEM*pmem,OS_MEM_DATA*pdata)

OSMemQuery()函數(shù)可以查詢(xún)特定內(nèi)存分區(qū)中的有關(guān)信息。該函數(shù)使用了一個(gè)新的OS_MEM_DATA的數(shù)據(jù)結(jié)構(gòu)來(lái)復(fù)制OS_MEM結(jié)構(gòu)中的信息,并比OS_MEM多一個(gè)成員。OS_MEM_DATA的數(shù)據(jù)結(jié)構(gòu)如程序清單9.5所示。函數(shù)的調(diào)用者可以是任務(wù)或者中斷,開(kāi)關(guān)量是OS_MEM_EN和OS_MEM_QUERY_EN。該函數(shù)有如下兩個(gè)參數(shù):(1)?pmem:指向內(nèi)存控制塊的指針。其值可以在調(diào)用OSMemCreate()函數(shù)時(shí)返回得到。

(2)?pdata:指向OS_MEM_DATA數(shù)據(jù)結(jié)構(gòu)的指針。它比OS_MEM多一個(gè)成員。 程序清單9.5OS_MEM_DATA的數(shù)據(jù)結(jié)構(gòu)

typedefstruct{

void OSAddr; /*指向內(nèi)存分區(qū)起始地址的指針 */

void OSFreeList; /*指向空閑內(nèi)存塊列表起始地址的指針 */

INT32U OSBlkSize; /*每個(gè)內(nèi)存塊的大小 */ INT32U OSNBlks; /*內(nèi)存分區(qū)的內(nèi)存塊總數(shù) */

INT32U OSNFree; /*空閑的內(nèi)存塊數(shù)量 */

INT32U OSNUsed; /*正在使用的內(nèi)存塊數(shù)量 */

}OS_MEM_DATA;9.5.2返回值

OSMemQuery()函數(shù)的返回值為下述內(nèi)容之一:

(1)?OS_NO_ERR:調(diào)用成功。

(2)?OS_MEM_INVALID_PMEM:pmem是空指針。

(3)?OS_MEM_INVALID_PDATA:pdata是空指針。

9.5.3源代碼

OSMemQuery()函數(shù)的源代碼如程序清單9.6所示,它將指定內(nèi)存分區(qū)的信息復(fù)制到OS_MEM_DATA定義的變量中。 程序清單9.6OSMemQuery()函數(shù)的源代碼

#ifOS_MEM_QUERY_EN>0

INT8UOSMemQuery(OS_MEM*pmem,OS_MEM_DATA*ppdata)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論