第8章 内存管理_第1页
第8章 内存管理_第2页
第8章 内存管理_第3页
第8章 内存管理_第4页
第8章 内存管理_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第8 8章章 内内 存存 管管 理理用于应用程序动态的申请和释放内存l C/OS-内存管理方案内存管理方案l 数据结构数据结构l 内存相关函数内存相关函数l 举例举例回忆一下回忆一下内存分配方案:内存分配方案: 分区分区 分页分页用多少,分配多少!用多少,分配多少!数据结构Seg1 操作系统操作系统 Seg2 空闲空闲 空闲分区表空闲分区表每个进程都有一个段表每个进程都有一个段表始址始址长度长度250K250K始址始址长度长度标志标志100K100KSeg1200K50KSeg20K100K200K250K500K为一个段分配分区始址始址长度长度350K150KSeg1 操作系统操作系统 S

2、eg2 空闲空闲 空闲分区表空闲分区表进程段表进程段表始址始址长度长度250K250K始址始址长度长度标志标志100K100KSeg1200K50KSeg20K100K200K250K500KSeg3 空闲空闲 n段内存请求段内存请求: reqSize = 100K始址始址长度长度标志标志100K100KSeg1200K50KSeg2250K100KSeg3350K释放一个内存分区始址始址长度长度350K150KSeg1 操作系统操作系统 Seg2 空闲分区表空闲分区表段表段表始址始址长度长度350K150K200K50K始址始址长度长度标志标志100K100KSeg1250K100KSeg3

3、0K100K200K250K500KSeg3 空闲空闲 n段段2不再需要,释放内存不再需要,释放内存始址始址长度长度标志标志100K100KSeg1200K50KSeg2250K100KSeg3350K空闲空闲 20KB 54KB58KB135KB254KB256KB1主存138KB作业2 0os作业3作业拼接前20KB 0 54KB131KB247KB256KB1主存os作业作业2作业3拼接后拼接、碎片整理拼接、碎片整理回忆一下回忆一下内存分配方案:内存分配方案: 分区分区 分页分页固定分配!固定分配!物理内存划分成大小相等的页框页框页框0 页框页框1 页框页框2 页框页框3 页框页框4 页

4、框页框5 页框页框6 页框页框7 段段0:页:页3 段段0:页:页0 段段0:页:页2 段段0:页:页1 程序被分割为大小相等的页,放到页框里程序被分割为大小相等的页,放到页框里分配内存,以页框为单位!分配内存,以页框为单位! 按分区分配,有外部碎片!按分区分配,有外部碎片! 按页框分配,有内部碎片!按页框分配,有内部碎片!C/OS-内存分配 图9.1 内存分区分成多个分区,每个分区划分成大小相等的块,每个分区的块大小不同第第8 8章章 内内 存存 管管 理理用于应用程序动态的申请和释放内存l C/OS-内存管理方案内存管理方案l 数据结构数据结构l 内存相关函数内存相关函数l 举例举例内存控

5、制块(Memory Control Blocks,MCB)typedef struct void *OSMemAddr; /*指向内存分区起始地址的指针*/ void *OSMemFreeList; /*下一个空闲内存控制块或者下一个空闲的内存块的指针*/ INT32U OSMemBlkSize; /*内存分区中内存块的大小*/ INT32U OSMemNBlks; /*内存分区中总的内存块数量*/ INT32U OSMemNFree; /*内存分区中当前可以得空闲内存块数量*/ OS_MEM;空闲内存控制块链表 OS_ CFG.H文件中的开关量OS_MEM_EN设置为1;然后还要设置OS_M

6、AX_MEM_PART常量,其值至少是2,它决定了系统中的最大分区数。 在启动时C/OS-就会通过OSInit()调用OSMemInit()来建立。内存控制块与内存分区和内存块的关系第第8 8章章 内内 存存 管管 理理用于应用程序动态的申请和释放内存l C/OS-内存管理方案内存管理方案l 数据结构数据结构l 内存相关函数内存相关函数l 举例举例程序运行期间内存分配#include #include void main() void check(int *); int *p1,i; void *p2; p2=malloc(5*sizeof(int); p1=(int *)p2; for(i=

7、0;i5;i+) scanf(%d,p1+i); check(p1); free(p2); 用时申请,用完释放 程序开始运行分配,运行完释放 程序函数开始时分配,函数结束时释放C/OS-内存管理函数分配内存块释放内存块内存管理函数的配置常量 建立内存分区建立内存分区OSMemCreate() 分配内存块分配内存块OSMemGet() 释放内存块释放内存块OSMemPut() 查询内存分区的状态查询内存分区的状态OSMemQuery()建立内存分区OSMemCreate()OSMemCreate()函数原型如下:OS_MEM *OSMemCreate( void *addr, INT32U nb

8、lks ,INT32U blksize, INT8U *err); 参数:addr: 建立的内存区的起始地址。内存区可以使用静态数组或在初始化时使用malloc()函数建立。nblks: 需要的内存块的数目。每一个内存区最少需要定义2个内存块。blksize: 每个内存块的大小,最少应该能够容纳一个指针。err: 指向包含错误码的变量的指针。 OS_NO_ERR :成功建立内存区。 OS_MEM_INVALID_PART :没有空闲的内存区。 OS_MEM_INVALID_BLKS :没有为每一个内存区建立至少两个内存块。 OS_MEM_INVALID_SIZE :内存块大小不足以容纳一个指针

9、变量。 返回值:OSMemCreate()函数返回指向内存区控制块的指针。如果没有剩余内存区,OSMemCreate()函数返回空指针。举例 OS_MEM *MemBuf; /*定义一个内存控制块指针 */INT8U buffer5016; /*定义一个内存分区数组 */void main (void)INT8U err;OSInit(); MemBuf = OSMemCreate(buffer, 50, 16, &err);.OSStart();内存控制块与内存分区和内存块的关系MemBuf = OSMemCreate(buffer, 50, 16, &err);buffer1650OSMe

10、mCreate()函数工作过程如下(1) 条件检查,确保各种前提条件的满足。(2) 从空闲内存控制块链表中取得一个内存控制块。(3) 若该空闲内存控制块可用,则将该内存分区内的所有内存块用指针链接成一个单向链表。因为在这个链表中,插入和删除元素都是从顶端开始的,所以无需使用双向链表。(4) 在内存分区的控制块中填写与该内存分区有关的内容。(5) 最后返回该内存控制块指针,以后的操作都通过该指针进行 建立内存分区建立内存分区OSMemCreate() 分配内存块分配内存块OSMemGet() 释放内存块释放内存块OSMemPut() 查询内存分区的状态查询内存分区的状态OSMemQuery()分

11、配内存块OSMemGet() OSMemGet()函数原型如下:Void *OSMemGet(OS_MEM *pmem, INT8U *err); 参数:pmem 是指向内存区控制块的指针err 是指向包含错误码的变量的指针。 OS_NO_ERR :成功得到一个内存块。 OS_MEM_NO_FREE_BLKS :内存区已经没有空间分配给内存块 OS_MEM_INVALID_PMEM:pmem是空指针 返回值:OSMemGet()函数返回指向内存区块的指针。如果没有空间分配给内存块,OSMemGet()函数返回空指针。OSMemGet()函数工作过程如下(1) 确保运行条件的满足。(2) 检查分

12、区是否有空闲的内存块,若有,则取得它,并作如下操作:因为已经从空闲内存块中取走了,所以要将它从空闲内存块链表中删除,并调整空闲内存块的指针,空闲内存块的数量也要相应减1;若没有空闲的内存块,则返回错误代码。举例 OS_MEM *MemBuf;/*定义一个内存控制块指针 */.void Task (void *pdata) INT8U *msg; pdata = pdata; for (; ;) msg = OSMemGet(MemBuf, &err); if (msg != (INT8U *)0) . /*内存块已经分配 */ 注意事项调用该函数申请内存块时,用户必须知道所建立的内存块的大小,

13、使用时不能超过容量。 用户程序必须在使用完内存块后及时释放,并重新放回它原先属于的分区中去。 函数可以多次调用。 如果暂时没有内存块可用,函数不会等待,而是立即返回NULL指针,所以可在中断中调用。 建立内存分区建立内存分区OSMemCreate() 分配内存块分配内存块OSMemGet() 释放内存块释放内存块OSMemPut() 查询内存分区的状态查询内存分区的状态OSMemQuery()释放内存块OSMemPut() 函数OSMemPut()原型如下:INT8U OSMemPut( OS_MEM *pmem, void *pblk); 参数:pmem:指向内存区控制块的指针blk:指向将

14、被释放的内存块的指针。 返回值:OS_NO_ERR :成功释放内存块OS_MEM_FULL :内存区已经不能再接受更多释放的内存块。这种情况说明用户程序出现了错误,释放了多于用OSMemGet()函数得到的内存块OS_MEM_INVALID_PMEM:pmem是空指针 OS_MEM_INVALID_PBLK:pblk是空指针。举例 OS_MEM *MemBuf; /*定义一个内存控制块指针 */INT8U *MemMsg; /*定义一个内存块指针 */.void Task (void *pdata) INT8U err; pdata = pdata; for (; ;) err = OSMem

15、Put(MemBuf, (void *)MemMsg); if (err = OS_NO_ERR) . /*处理代码 */ . 注意事项(1) 如果一个内存块已经不再使用,必须及时释放它,以备其它应用程序使用。(2) 释放内存块时,必须放回到原先申请的内存分区中,不能错放,否则可能导致系统崩溃。 建立内存分区建立内存分区OSMemCreate() 分配内存块分配内存块OSMemGet() 释放内存块释放内存块OSMemPut() 查询内存分区的状态查询内存分区的状态OSMemQuery()查询内存分区的状态OSMemQuery函数OSMemQuery()原型如下:INT8U OSMemQuer

16、y(OS_MEM *pmem, OS_MEM_DATA *pdata); 参数:pmem:指向内存区控制块的指针,可以从OSMemCreate()函数返回得到。pdata:指向OS_MEM_DATA数据结构的指针 返回值:OS_NO_ERR。OS_MEM_INVALID_PMEM:pmem是空指针 OS_MEM_INVALID_PDATA:pdata是空指针OS_MEM_DATA包含了以下的域void OSAddr;/*指向内存区起始地址的指针*/ voidOSFreeList;/*指向空闲内存块列表起始地址的指针*/INT32UOSBlkSize;/*每个内存块的大小*/INT32UOSNB

17、lks;/*该内存区的内存块总数*/INT32UOSNFree;/*空闲的内存块数目*/INT32UOSNUsed; /*使用的内存块数目*/范例OS_MEM *MemBuf; /*定义内存控制块指针*/void Task (void *pdata) INT8U err; OS_MEM_DATA mem_data; /*定义一个新的结构来复制分区中的信息*/pdata = pdata; for (; ;) . err = OSMemQuery(MemBuf, &mem_data); . 第第8 8章章 内内 存存 管管 理理用于应用程序动态的申请和释放内存l C/OS-内存管理方案内存管理方案l 数据结构数据结构l 内存相关函数内存相关函数l 举例举例8.5 C/OS-II内存管理应用举例 例8-1 本例演示C/OS-II的内存管理

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论