版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、嵌入式實時操作系統(tǒng)嵌入式實時操作系統(tǒng)C/OS-C/OS-教程教程 第九章第九章 內(nèi)存管理內(nèi)存管理第第 9 9 章章 內(nèi)存管理內(nèi)存管理一、內(nèi)存管理基本原理二、四個內(nèi)存管理函數(shù) 本章主要內(nèi)容嵌入式實時操作系統(tǒng)嵌入式實時操作系統(tǒng)C/OS-C/OS-教程教程 第九章第九章 內(nèi)存管理內(nèi)存管理9.1 概述 9.1.1 基本原理構(gòu)建新型內(nèi)存管理方法的原因 在內(nèi)存管理方面,ANSI C本身就提供了malloc()和free()兩個函數(shù)用于動態(tài)地分配內(nèi)存和釋放內(nèi)存。 但是C/OS-II為什么不直接利用這兩個函數(shù),而要另外構(gòu)建內(nèi)存管理方法呢?主要原因在于:(1 1)內(nèi)存碎片問題:)內(nèi)存碎片問題:當應(yīng)用程序反復(fù)調(diào)用
2、malloc()和free()函數(shù)進行內(nèi)存的分配與釋放時,可能會將原來一塊很大且連續(xù)的內(nèi)存區(qū)域,逐漸分割成許多細小而彼此不相鄰的內(nèi)存區(qū)域,產(chǎn)生我們通常說的內(nèi)存碎片。當內(nèi)存碎片大量存在時,最后應(yīng)用程序可能連一塊很小的內(nèi)存也無法分配到;(2 2)執(zhí)行時間不確定的問題:)執(zhí)行時間不確定的問題:由于內(nèi)存管理算法的原因,malloc()和free()函數(shù)的執(zhí)行時間是不確定的,因此不適合作實時操作系統(tǒng)函數(shù)應(yīng)用。嵌入式實時操作系統(tǒng)嵌入式實時操作系統(tǒng)C/OS-C/OS-教程教程 第九章第九章 內(nèi)存管理內(nèi)存管理二、解決方案1. 1. 采用兩個技術(shù):(1 1)內(nèi)存分區(qū)分塊技術(shù):)內(nèi)存分區(qū)分塊技術(shù):把連續(xù)大塊的內(nèi)存
3、分成內(nèi)存分區(qū),每個分區(qū)又分成整數(shù)個大小相同的內(nèi)存塊;(2 2)內(nèi)存指針描述和鏈接技術(shù):內(nèi)存指針描述和鏈接技術(shù):用指針表示每個分區(qū)和內(nèi)存塊的地址,并用指針把同一分區(qū)中的每個內(nèi)存塊鏈接成起來,形成邏輯上的連續(xù)內(nèi)存空間。構(gòu)建了C/OS-II的內(nèi)存管理方法。2.2. 執(zhí)行時間問題:執(zhí)行時間問題:由于C/OS-II每個內(nèi)存塊的大小是固定的,而且一次只能分配或釋放一個內(nèi)存塊,這就使得每次的分配或釋放都可以通過使用一條指針來實現(xiàn)的。這就解決了內(nèi)存管理上執(zhí)行時間不確定的問題。分區(qū)2圖圖9.1 內(nèi)存分區(qū)內(nèi)存分區(qū) 塊內(nèi)存分區(qū)分區(qū)103.3. 內(nèi)存碎片問題:內(nèi)存碎片問題:分配內(nèi)存時,可以從不同的內(nèi)存分區(qū)中得到大小不
4、同的內(nèi)存塊。當釋放時,規(guī)定:內(nèi)存塊需要用指針鏈接回到它以前所屬于的內(nèi)存分區(qū)。這樣一來,經(jīng)過多次反復(fù)分配和釋放后,分區(qū)中的自由內(nèi)存塊在物理空間上可能不再連續(xù),但邏輯空間卻始終都是連續(xù)的。嵌入式實時操作系統(tǒng)嵌入式實時操作系統(tǒng)C/OS-C/OS-教程教程 第九章第九章 內(nèi)存管理內(nèi)存管理9.1.2 內(nèi)存管理函數(shù)C/OS-C/OS-提供了提供了4 4種內(nèi)存管理的函數(shù),函數(shù)所屬文件是種內(nèi)存管理的函數(shù),函數(shù)所屬文件是OS_MEM.COS_MEM.C。表表9.1 9.1 內(nèi)存管理函數(shù)一覽表內(nèi)存管理函數(shù)一覽表函數(shù)函數(shù)功能功能調(diào)用者調(diào)用者OSMemCreate()OSMemCreate()建立內(nèi)存分區(qū)建立內(nèi)存分區(qū)
5、任務(wù)或者啟動代碼任務(wù)或者啟動代碼OSMemGet()OSMemGet()獲取一個內(nèi)存塊獲取一個內(nèi)存塊任務(wù)或者中斷任務(wù)或者中斷OSMemPut()OSMemPut()釋放一個內(nèi)存塊釋放一個內(nèi)存塊任務(wù)或者中斷任務(wù)或者中斷OSMemQuery()OSMemQuery()查詢內(nèi)存分區(qū)的狀態(tài)查詢內(nèi)存分區(qū)的狀態(tài)任務(wù)或者中斷任務(wù)或者中斷9.1.3 內(nèi)存管理函數(shù)配置常量表表9.2 9.2 信號量函數(shù)配置常量一覽表信號量函數(shù)配置常量一覽表函數(shù)函數(shù)配置常量配置常量說明說明系統(tǒng)配置系統(tǒng)配置OS_MEM_ENOS_MEM_EN該常量為該常量為0 0時,屏蔽所有信號量函數(shù)時,屏蔽所有信號量函數(shù)OS_MAX_MEM_PA
6、RTOS_MAX_MEM_PART定義最大內(nèi)存分區(qū)數(shù),至少為定義最大內(nèi)存分區(qū)數(shù),至少為2 2。OSMemCreate()OSMemCreate()內(nèi)存管理必然包含這內(nèi)存管理必然包含這3 3個函數(shù),所以個函數(shù),所以它們沒有單獨的配置常量。它們沒有單獨的配置常量。OSMemGet()OSMemGet()OSSemPut()OSSemPut()OSMemQuery()OSMemQuery()OS_MEM_QUERY_ENOS_MEM_QUERY_EN嵌入式實時操作系統(tǒng)嵌入式實時操作系統(tǒng)C/OS-C/OS-教程教程 第九章第九章 內(nèi)存管理內(nèi)存管理9.1.4 內(nèi)存控制塊一、內(nèi)存控制塊數(shù)據(jù)結(jié)構(gòu) 內(nèi)存控制塊
7、(MCB:memory control blocks)是用于實現(xiàn)內(nèi)存管理、跟蹤每一個內(nèi)存分區(qū)的數(shù)據(jù)結(jié)構(gòu),定義如程序清單9.1所示,每個內(nèi)存分區(qū)都有它自己的內(nèi)存控制塊。程序清單程序清單9.1 內(nèi)存控制塊的數(shù)據(jù)結(jié)構(gòu)內(nèi)存控制塊的數(shù)據(jù)結(jié)構(gòu)typedef struct void *OSMemAddr;/ 是指向內(nèi)存分區(qū)起始地址的指針。它在建立/ 內(nèi)存分區(qū)時被初始化, 此后不能更改。 void *OSMemFreeList;/ 在空閑內(nèi)存控制塊鏈表中,是指向下一個空/ 閑內(nèi)存控制塊的指針;在已建立的內(nèi)存分區(qū)/ 中,是指向第一個空閑內(nèi)存塊的指針。 INT32U OSMemBlkSize;/ 內(nèi)存分區(qū)中內(nèi)存塊
8、的大小,由用戶在建立內(nèi)/ 存分區(qū)時指定 INT32U OSMemNBlks;/ 內(nèi)存分區(qū)中總的內(nèi)存塊數(shù)量,由用戶在建立/ 內(nèi)存分區(qū)時指定 INT32U OSMemNFree; / 內(nèi)存分區(qū)中當前可以使用的空閑內(nèi)存塊數(shù)量 OS_MEM;嵌入式實時操作系統(tǒng)嵌入式實時操作系統(tǒng)C/OS-C/OS-教程教程 第九章第九章 內(nèi)存管理內(nèi)存管理二、應(yīng)用前提 如果要使用C/OS-II中的內(nèi)存管理,要做如下工作:需要將OS_CFG.H文件中將配置OS_MEM_EN設(shè)置為1;然后還要設(shè)置OS_MAX_MEM_PART常量,其值至少是2,它定義了系統(tǒng)中的最大分區(qū)數(shù)。這樣,在啟動時C/OS-II就會通過OSInit()
9、調(diào)用OSMemInit()來實現(xiàn)對內(nèi)存管理器的初始化,該初始化主要建立一個如圖9.2所示的空閑內(nèi)存控制塊鏈表1.其中OSMemFreeList指針的作用是將空閑內(nèi)存控制塊鏈接成空閑內(nèi)存控制塊鏈表。 圖圖9.2 空閑內(nèi)存控制塊鏈表空閑內(nèi)存控制塊鏈表 OSMemAddrOSMemFreeListOSMemBlkSizeOSMemNBlksOSMemNFreeOSMemAddrOSMemFreeListOSMemBlkSizeOSMemNBlksOSMemNFreeOSMemAddrOSMemFreeListOSMemBlkSizeOSMemNBlksOSMemNFreeOSMemFreeList0
10、OS_MAX_MEM_PART嵌入式實時操作系統(tǒng)嵌入式實時操作系統(tǒng)C/OS-C/OS-教程教程 第九章第九章 內(nèi)存管理內(nèi)存管理9.2 建立內(nèi)存分區(qū),OSMemCreate() 9.2.1 函數(shù)原型OS_MEM *OSMemCreate( void *addr,INT32U nblks,INT32U blksize,INT8U *err) reentrant功能:功能:OSMemCreate()函數(shù)用于建立并初始化一塊內(nèi)存分區(qū)。要函數(shù)用于建立并初始化一塊內(nèi)存分區(qū)。要使用內(nèi)存管理函數(shù),必先調(diào)用使用內(nèi)存管理函數(shù),必先調(diào)用OSMemCreate()函數(shù)建立內(nèi)存分區(qū)。函數(shù)建立內(nèi)存分區(qū)。一個內(nèi)存分區(qū)包含數(shù)
11、量和大小都確定的內(nèi)存塊,應(yīng)用程序可以分一個內(nèi)存分區(qū)包含數(shù)量和大小都確定的內(nèi)存塊,應(yīng)用程序可以分配這些內(nèi)存塊,并在用完后釋放回內(nèi)存分區(qū)。配這些內(nèi)存塊,并在用完后釋放回內(nèi)存分區(qū)。函數(shù)參數(shù)函數(shù)參數(shù) addr 建立的內(nèi)存分區(qū)的起始地址。內(nèi)存分區(qū)可以使用靜態(tài)數(shù)建立的內(nèi)存分區(qū)的起始地址。內(nèi)存分區(qū)可以使用靜態(tài)數(shù)組或在初始化時使用組或在初始化時使用malloc()函數(shù)建立;函數(shù)建立;nblks 內(nèi)存塊的數(shù)量。每一個內(nèi)存分區(qū)最少需要定義內(nèi)存塊的數(shù)量。每一個內(nèi)存分區(qū)最少需要定義2個內(nèi)存?zhèn)€內(nèi)存塊;塊;blksize 每個內(nèi)存塊的大小,最少應(yīng)該能夠容納一個指針;每個內(nèi)存塊的大小,最少應(yīng)該能夠容納一個指針;一一err
12、指向錯誤代碼的變量的指針。指向錯誤代碼的變量的指針。嵌入式實時操作系統(tǒng)嵌入式實時操作系統(tǒng)C/OS-C/OS-教程教程 第九章第九章 內(nèi)存管理內(nèi)存管理err 指向錯誤代碼的變量的指針。指向錯誤代碼的變量的指針。OSMemCreate()函數(shù)返回的錯誤代碼可能有以下幾種:函數(shù)返回的錯誤代碼可能有以下幾種:OS_NO_ERR 內(nèi)存分區(qū)建立成功;內(nèi)存分區(qū)建立成功;OS_MEM_INVALID_ADDR 參數(shù)參數(shù)addr為空指針,非法;為空指針,非法;OS_MEM_INVALID_PART 沒有空閑的內(nèi)存分區(qū);沒有空閑的內(nèi)存分區(qū);OS_MEM_INVALID_BLKS 沒有為每一個內(nèi)存分區(qū)建立至少沒有為
13、每一個內(nèi)存分區(qū)建立至少兩個內(nèi)存塊;兩個內(nèi)存塊;OS_MEM_INVALID_SIZE 內(nèi)存塊太小,不能容納一個指針內(nèi)存塊太小,不能容納一個指針變量。變量。調(diào)用者:調(diào)用者:任務(wù)或者啟動代碼。任務(wù)或者啟動代碼。配置常量:配置常量:沒有單獨的配置常量。沒有單獨的配置常量。9.2.2 返回值如果建立成功,如果建立成功,OSMemCreate()函數(shù)返回指向內(nèi)存控制塊的指針;函數(shù)返回指向內(nèi)存控制塊的指針;若沒有空閑內(nèi)存分區(qū),說明建立不成功,若沒有空閑內(nèi)存分區(qū),說明建立不成功,OSMemCreate()函數(shù)返回函數(shù)返回空指針??罩羔?。 嵌入式實時操作系統(tǒng)嵌入式實時操作系統(tǒng)C/OS-C/OS-教程教程 第九
14、章第九章 內(nèi)存管理內(nèi)存管理9.2.3 原理與實現(xiàn)一OSMemCreate()函數(shù)基本原理:從空閑內(nèi)存控制塊鏈表中去一個內(nèi)存控制塊,根據(jù)參數(shù)addr、nblks和blksize構(gòu)建如圖9.3所示的空閑內(nèi)存塊單向鏈表,并根據(jù)這3個參數(shù)填寫內(nèi)存控制塊中的5個參數(shù),最后返回指向內(nèi)存控制塊的指針。以后針對內(nèi)存的管理操作都可以通過這個指針來完成。OSMemAddr = addrOSMemFreeList= addrOSMemBlkSize = blkSizeOSMemNBlks = nblksOSMemNFree = nblks內(nèi)存分區(qū)0pmem函數(shù)運行完畢后,內(nèi)存控制塊所對應(yīng)的內(nèi)存分區(qū)與分區(qū)中的內(nèi)存塊之
15、間的關(guān)系如圖9.3所示。程序一旦運行,經(jīng)過多次分配與 釋放內(nèi)存塊后,同一分區(qū)內(nèi)的內(nèi)存塊的鏈接順序會有很大變化,但這并不影響使用,也不增加時間開銷。圖9.3 OSMemCretae() 建立的內(nèi)存分區(qū) 嵌入式實時操作系統(tǒng)嵌入式實時操作系統(tǒng)C/OS-C/OS-教程教程 第九章第九章 內(nèi)存管理內(nèi)存管理OS_MEM *MemBuf; / 定義一個內(nèi)存控制塊指針I(yè)NT8U buffer5016; / 定義一個內(nèi)存分區(qū)數(shù)組, / 含50個內(nèi)存塊,每塊16個字節(jié)void main (void) INT8U err;OSInit();. MemBuf = OSMemCreate(buffer,50,16,&a
16、mp;err);.OSStart();9.2.4 應(yīng)用范例 OSMemCreate()函數(shù)應(yīng)用范例如程序清單9.3所示:建立一個含有50個內(nèi)存塊、每個內(nèi)存塊16字節(jié)的內(nèi)存分區(qū)。程序清單程序清單9.3 OSMemCreate()應(yīng)用范例應(yīng)用范例嵌入式實時操作系統(tǒng)嵌入式實時操作系統(tǒng)C/OS-C/OS-教程教程 第九章第九章 內(nèi)存管理內(nèi)存管理9.3 獲取內(nèi)存塊,OSMemGet() 9.3.1 函數(shù)原型void *OSMemGet(OS_MEM *pmem,INT8U *err) reentrant功能:功能:OSMemGet()OSMemGet()函數(shù)用于從已經(jīng)建立的內(nèi)存分區(qū)中申請獲函數(shù)用于從已經(jīng)
17、建立的內(nèi)存分區(qū)中申請獲取一個內(nèi)存塊。函數(shù)的調(diào)用者可以是任務(wù)或者中斷,沒有單取一個內(nèi)存塊。函數(shù)的調(diào)用者可以是任務(wù)或者中斷,沒有單獨的配置常量。獨的配置常量。參數(shù)參數(shù)pmem pmem 指向內(nèi)存控制塊的指針,它是調(diào)用指向內(nèi)存控制塊的指針,它是調(diào)用OSMemCreate()OSMemCreate()函數(shù)建函數(shù)建立內(nèi)存分區(qū)時的返回值。立內(nèi)存分區(qū)時的返回值。errerr 指向包含錯誤代碼的變量的指針,錯誤代碼有以下幾種:指向包含錯誤代碼的變量的指針,錯誤代碼有以下幾種: OS_NO_ERROS_NO_ERR 成功得到一個內(nèi)存塊;成功得到一個內(nèi)存塊; OS_MEM_NO_FREE_BLKSOS_MEM_N
18、O_FREE_BLKS 內(nèi)存分區(qū)中已經(jīng)沒有空閑內(nèi)存塊;內(nèi)存分區(qū)中已經(jīng)沒有空閑內(nèi)存塊; OS_MEM_INVALID_PMEM OS_MEM_INVALID_PMEM pmempmem是空指針。是空指針。9.3.2 返回值如果獲取成功,如果獲取成功,OSMemGet()OSMemGet()函數(shù)返回指向內(nèi)存區(qū)塊的指針;函數(shù)返回指向內(nèi)存區(qū)塊的指針;一一如果沒有空間分配給內(nèi)存塊,函數(shù)返回空指針。如果沒有空間分配給內(nèi)存塊,函數(shù)返回空指針。嵌入式實時操作系統(tǒng)嵌入式實時操作系統(tǒng)C/OS-C/OS-教程教程 第九章第九章 內(nèi)存管理內(nèi)存管理9.3.3 原理與實現(xiàn) OSMemGet()函數(shù)基本原理:從參數(shù)pmem
19、指定的內(nèi)存分區(qū)中抽取第一個空閑的內(nèi)存塊。如果這個空閑內(nèi)存塊可用,則調(diào)整OSMemFreeList指針,使其指向空閑內(nèi)存塊鏈表中的下一個空閑內(nèi)存塊,并返回所獲取的內(nèi)存塊指針;如果不可用,則返回空指針。9.3.4 應(yīng)用要點調(diào)用OSMemGet()函數(shù)申請獲取內(nèi)存塊時,用戶必須知道內(nèi)存分區(qū)中內(nèi)存塊的大小,使用時不能超過容量。例如,如果一個內(nèi)存分區(qū)內(nèi)的每個內(nèi)存塊為64字節(jié),那么,應(yīng)用程序最多只能使用內(nèi)存塊中的64字節(jié);用戶在使用完內(nèi)存塊后應(yīng)該及時釋放,且必須重新放回它原先所屬的內(nèi)存分區(qū)中去;函數(shù)可以反復(fù)多次調(diào)用;1.如果暫時沒有內(nèi)存塊可用,函數(shù)不會等待,而是立即返回NULL指針,所以可在中斷中調(diào)用。
20、嵌入式實時操作系統(tǒng)嵌入式實時操作系統(tǒng)C/OS-C/OS-教程教程 第九章第九章 內(nèi)存管理內(nèi)存管理程序清單程序清單9.5 OSMemGet()應(yīng)用范例應(yīng)用范例OS_MEM *MemBuf; / 定義一個內(nèi)存控制塊指針void Task (void *ppdata) reentrant INT8U *msg; ppdata = ppdata;for (;) msg = OSMemGet(MemBuf,&err);if (msg != (INT8U *)0) . / 內(nèi)存塊已經(jīng)分配 9.3.5 應(yīng)用范例嵌入式實時操作系統(tǒng)嵌入式實時操作系統(tǒng)C/OS-C/OS-教程教程 第九章第九章 內(nèi)存管理內(nèi)
21、存管理9.4 釋放內(nèi)存塊,OSMemPut() 9.4.1 函數(shù)原型,OSMemPut()INT8U OSMemPut( OS_MEM *pmem,void *pblk) reentrant功能:功能:OSMemPut()OSMemPut()函數(shù)用于釋放一個內(nèi)存塊。函數(shù)用于釋放一個內(nèi)存塊。配置常量:配置常量:沒有單獨的配置常量。沒有單獨的配置常量。調(diào)用者:調(diào)用者:任務(wù)或者中斷。任務(wù)或者中斷。函數(shù)參數(shù)函數(shù)參數(shù)pmem pmem 指向內(nèi)存控制塊的指針,它是調(diào)用指向內(nèi)存控制塊的指針,它是調(diào)用OSMemCreate()OSMemCreate()函數(shù)建立內(nèi)存分區(qū)時函數(shù)建立內(nèi)存分區(qū)時的返回值;的返回值;一
22、一pblkpblk 指向?qū)⒁会尫诺膬?nèi)存塊的指針。指向?qū)⒁会尫诺膬?nèi)存塊的指針。嵌入式實時操作系統(tǒng)嵌入式實時操作系統(tǒng)C/OS-C/OS-教程教程 第九章第九章 內(nèi)存管理內(nèi)存管理9.4.2 返回值 OSMemPut()函數(shù)的返回值有如下幾種:OS_NO_ERR 內(nèi)存塊釋放成功;OS_MEM_FULL 內(nèi)存分區(qū)已滿,不能再接受釋放的內(nèi)存塊。這種情況說明用戶程序出現(xiàn)了錯誤,釋放的內(nèi)存塊多于用OSMemGet()函數(shù)得到的內(nèi)存塊;OS_MEM_INVALID_PMEM pmem是空指針;OS_MEM_INVALID_PBLK pblk是空指針。9.4.3 原理與實現(xiàn) OSMemPut()函數(shù)基本原理:
23、通過檢查參數(shù)pmem指定的內(nèi)存分區(qū)是否已滿,來確定是否可以釋放內(nèi)存塊。如果已滿,說明系統(tǒng)在分配和釋放內(nèi)存時出現(xiàn)了錯誤,無法釋放。如果未滿,則將參數(shù)pblk指定的內(nèi)存塊插入到參數(shù)pmem指定的空閑內(nèi)存塊鏈表的最前面,成功釋放。 嵌入式實時操作系統(tǒng)嵌入式實時操作系統(tǒng)C/OS-C/OS-教程教程 第九章第九章 內(nèi)存管理內(nèi)存管理9.4.4 應(yīng)用要點如果一個內(nèi)存塊已經(jīng)不再使用,必須及時釋放它,以備其它應(yīng)用程序使用;釋放內(nèi)存塊時,必須放回到原先申請的內(nèi)存分區(qū)中,不能錯放,否則可能導(dǎo)致系統(tǒng)崩潰。1. 例如:從每個內(nèi)存塊是32字節(jié)的內(nèi)存分區(qū)中申請了一個內(nèi)存塊,用完后就不能把它返回給每個內(nèi)存塊是64字節(jié)的內(nèi)存分
24、區(qū)。應(yīng)用程序以后申請64字節(jié)分區(qū)中的內(nèi)存塊時,可能會只得到32字節(jié)的可用空間,而得不到64字節(jié)的內(nèi)存塊。嵌入式實時操作系統(tǒng)嵌入式實時操作系統(tǒng)C/OS-C/OS-教程教程 第九章第九章 內(nèi)存管理內(nèi)存管理程序清單程序清單9.7 OSMemPut()應(yīng)用范例應(yīng)用范例OS_MEM *MemBuf; / 定義一個內(nèi)存控制塊指針I(yè)NT8U *MemMsg; / 定義一個內(nèi)存塊指針void Task (void *ppdata) reentrant INT8U err; ppdata = ppdata;for (;) err = OSMemPut(MemBuf,(void *)MemMsg); if (er
25、r = = OS_NO_ERR) 應(yīng)用程序; . 9.4.5 應(yīng)用范例嵌入式實時操作系統(tǒng)嵌入式實時操作系統(tǒng)C/OS-C/OS-教程教程 第九章第九章 內(nèi)存管理內(nèi)存管理9.5 查詢內(nèi)存分區(qū)的狀態(tài),OSMemQuery() 9.5.1 函數(shù)原型INT8U OSMemQuery(OS_MEM *pmem,OS_MEM_DATA *ppdata) reentrant功能功能:OSMemQuery()OSMemQuery()函數(shù)用于查詢指定內(nèi)存分區(qū)中的有關(guān)信息,函數(shù)用于查詢指定內(nèi)存分區(qū)中的有關(guān)信息,函數(shù)使用了一個新的數(shù)據(jù)結(jié)構(gòu)函數(shù)使用了一個新的數(shù)據(jù)結(jié)構(gòu)OS_MEM_DATAOS_MEM_DATA來復(fù)制來復(fù)
26、制OS_MEMOS_MEM結(jié)構(gòu)中的信息,并比結(jié)構(gòu)中的信息,并比OS_MEMOS_MEM多一個成員,其數(shù)據(jù)結(jié)構(gòu)如程序清多一個成員,其數(shù)據(jù)結(jié)構(gòu)如程序清單單9.89.8所示。所示。調(diào)用者調(diào)用者:可以是任務(wù),也可以是中斷。:可以是任務(wù),也可以是中斷。配置常量配置常量:OS_MEM_QUERY_ENOS_MEM_QUERY_EN。函數(shù)參數(shù)函數(shù)參數(shù)pmempmem 指向內(nèi)存控制塊的指針,它是調(diào)用指向內(nèi)存控制塊的指針,它是調(diào)用OSMemCreate()OSMemCreate()函數(shù)建立內(nèi)存分區(qū)時的返回值。函數(shù)建立內(nèi)存分區(qū)時的返回值。一一ppdatappdata 指向指向OS_MEM_DATAOS_MEM_DATA數(shù)據(jù)結(jié)構(gòu)的指針,它比數(shù)據(jù)結(jié)構(gòu)的指針,它比OS_MEMOS_MEM多一個成員。多一個成員。嵌入式實時操作系統(tǒng)嵌入式實時操作系統(tǒng)C/OS-C/OS-教程教程 第九章第九章 內(nèi)存管理內(nèi)存管理程序清單程序清單9.8 OS_MEM_DATA9.8 OS_MEM_DATA數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)typede
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025合同模板活動合同范本
- 2025建材分裝廠合同范文
- 2025年度智能櫥柜定制采購合同8篇
- 2025餐飲酒店供貨合同范本
- 2025拆除煙囪協(xié)議合同
- 2025年度產(chǎn)業(yè)園區(qū)委托運營管理與招商引資合同4篇
- 二零二五年度商業(yè)停車場車位代理銷售與管理合同模板4篇
- 買賣合同糾紛原告代理詞2篇
- 二零二五年度承臺基坑開挖施工勞務(wù)分包合同合同終止與解除條件4篇
- 2025年度高端制造業(yè)自動化生產(chǎn)線安裝與勞務(wù)派遣合同3篇
- 南通市2025屆高三第一次調(diào)研測試(一模)地理試卷(含答案 )
- 2025年上海市閔行區(qū)中考數(shù)學(xué)一模試卷
- 2025中國人民保險集團校園招聘高頻重點提升(共500題)附帶答案詳解
- 重癥患者家屬溝通管理制度
- 法規(guī)解讀丨2024新版《突發(fā)事件應(yīng)對法》及其應(yīng)用案例
- IF鋼物理冶金原理與關(guān)鍵工藝技術(shù)1
- 銷售提成對賭協(xié)議書范本 3篇
- 勞務(wù)派遣招標文件范本
- EPC項目階段劃分及工作結(jié)構(gòu)分解方案
- 《跨學(xué)科實踐活動4 基于特定需求設(shè)計和制作簡易供氧器》教學(xué)設(shè)計
- 信息安全意識培訓(xùn)課件
評論
0/150
提交評論