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

下载本文档

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

文档简介

第五章动态内存管理第一页,共三十页,编辑于2023年,星期四第五章动态内存管理5.1内存控制块5.1.1可动态分配内存的划分5.1.2内存控制块OS_MEM的结构5.1.3空内存控制块链表5.2动态内存的管理5.2.1创建动态内存分区5.2.2请求获得一个内存块5.2.3释放一个内存块5.2.4查询一个内存分区的状态第二页,共三十页,编辑于2023年,星期四5.1内存控制块uC/OS-II对内存斤西瓜两级管理,即把一个连续的内存空间分为若干个分区,每个分区又分为若干个大小相等的内存块。操作系统以分区为单位来管理动态内存,而任务以内存块为单位来获得和释放动态内存。内存分区及内存块的使用情况则由内存控制块来记录第三页,共三十页,编辑于2023年,星期四5.1.1可动态分配内存的划分1.内存块:uC/OS-II以内存块为单位向应用程序提供动态内存。内存块的大小可由用户定制2.内存分区:大小相等的多个内存块可以组成一个内存分区。内存分区是系统对内存进行管理的基本单位3.内存分区与内存块的定义:在内存中定义一个内存分区及其内存块的方法很简单,只要定义一个二维数组即可如:INT16UIntMemBuf[10][10]第四页,共三十页,编辑于2023年,星期四上面定义的只是在内存中划分出了分区及内存块的区域,还不是一个真正的可以动态分配的内存区(如图5.1a)只有把内存控制块与分区关联起来之后,系统才能对其进行相应的管理和控制,才是一个真正的动态内存区(如图5.1b)第五页,共三十页,编辑于2023年,星期四5.1a没有控制块时的分区b有控制块时的分区第六页,共三十页,编辑于2023年,星期四5.1.2内存控制块OS_MEM的结构为了是系统能够感知和有效管理内存分区,uC/OS-II定义了一个叫做内存控制块(OS_MEM)的数据结构。系统就用这个内存控制块来记录和跟踪每一个内存分区的状态第七页,共三十页,编辑于2023年,星期四内存控制块的内存分区指针OSMemAddr指向了内存分区,内存分区中的各个内存块又组成了一个单项链表,内存控制块的链表指针OSMemFreeList就指向了这个单向链表的头内存控制块的其他3个变量分别记录了分区中内存块的长度,总数目以及现在还为被分配的内存块数目第八页,共三十页,编辑于2023年,星期四5.1.3空内存控制块链表与uC/OS-II其他控制块一样,在uC/OS-II初始化时,会调用内存控制块的初始化函数OS_MemInit()定义并初始化一个空内存控制块链表在这个空内存控制块链表中,一共有OS_MAX_MEM_PART(在文件OS_CFG.H中定义的常数)个空内存控制块。这些空内存控制块的指针成员OSMemFreeList暂时作为指向下一个空内存控制块的指针第九页,共三十页,编辑于2023年,星期四空内存控制块链表第十页,共三十页,编辑于2023年,星期四每当应用程序需要创建一个内存分区时,系统就会从空内存控制块链表中摘取一个控制块,而把链表的头指针OSMemFreeList指向下一个空内存控制块每当应用程序释放一个内存分区时,则会把该分区对应的内存控制块归还给空内存控制块链表第十一页,共三十页,编辑于2023年,星期四5.2动态内存的管理用于动态内存管理的函数有:创建动态内存分区函数请求获得内存块函数释放内存块函数查询动态内存分区状态函数第十二页,共三十页,编辑于2023年,星期四5.2.1创建动态内存分区应用程序可以通过OSMemCreate()来建立一个内存分区OS_MEM*OSMemCreate(void*addr, //内存分区的起始地址INT32Unblks, //分区中内存块的数目INT32Ublksize, //每个内存块的字节数INT8U*err //错误信息)第十三页,共三十页,编辑于2023年,星期四第十四页,共三十页,编辑于2023年,星期四在各类判断条件中有两个问题值得注意:1.分区的内存块至少有两块2.每个内存块的空间至少能存放一个指针,因为要在内存块中建立一个用于把分区内的内容块连接为一个链表的指针第十五页,共三十页,编辑于2023年,星期四例如:5.1建立一个含有50个内存块并且每块的长度为64字节的内存分区。试写出主要代码:第十六页,共三十页,编辑于2023年,星期四//定义全局变量OS_MEM*CommTxBuffer; //定义内存分区指针INT8UCommTxPart[50][64]; //定义分区和内存块INT8Uerr;//在主函数的适当位置建立内存分区voidmain(void){OSInit();......CommTxBuffer=OSMemCreate(CommTxPart, //内存分区的首地址50, //分区内存块的数目64, //每个内存块的长度&err);....OSStart()}第十七页,共三十页,编辑于2023年,星期四5.2.2请求获得一个内存块在应用程序需要一个内存块时,应用程序可以通过调用函数OSMemGet()向某内存分区请求获得一个内存块。该函数的原型如下:void*OSMemGet(OS_MEM*pmem, //内存分区指针INT8U*err //错误信息);参数pmem试应用程序希望获得的内存块所在内存分区所对应的内存控制块的指针第十八页,共三十页,编辑于2023年,星期四第十九页,共三十页,编辑于2023年,星期四函数OSMemGet()在判断应用程序传递来的内存控制块的指针为非NULL及内存分区尚存在未被分配的内存块后,就将内存块链表的第一块的指针OSMemFreeList献给了指针pblk;然后就重新调整内存块链表,并使指针OSMemFreeList指向新的链表头;最后返回指针pblk.当函数调用失败,返回null第二十页,共三十页,编辑于2023年,星期四例:在5.1基础上写出任务MyTask请求一个内存块的代码第二十一页,共三十页,编辑于2023年,星期四//定义全局变量OS_MEM*CommTxBuffer; //定义内存分区指针INT8UCommTxPart[50][64]; //定义分区和内存块INT8Uerr;INT8U*BlkPtr; //定义内存块指针//在主函数的适当位置建立内存分区voidmain(void){同前}//在任务MyTask的合适位置请求内存块voidMyTask((void*)pdata){...for(;;){BlkPtr=OSMemGet(CommTxBuffer, //内存分区的指针&err //错误信息);........}}第二十二页,共三十页,编辑于2023年,星期四需要注意的是,应用程序在调用函数OSMemGet()时,应该事先知道该分区中内存块的大小,并且在使用时不能超过改内存块长度,否则会引起灾难性的后果第二十三页,共三十页,编辑于2023年,星期四5.2.3释放一个内存块当应用程序不再使用一个内存块时,必须及时地将其释放应用程序通过调用函数OSMemPut()来释放一个内存块INT8UOSMemPut(OS_MEM*pmem,//内存块所属内存分区的指针void*pblk //待释放内存块的指针);第二十四页,共三十页,编辑于2023年,星期四函数返回值是错误信息。如果函数调用成功,返回信息OS_NO_ERR;否则根据具体错误将返回OS_MEM_INVALID_PMEM(控制块指针为空指针),OS_INVALID_PBLK(释放内存块指针为空指针)和OS_MEM_FULL(分区已满)需要注意的是,在调用该函数的一个内存块时,一定要确保把该内存块释放到它原来所属的内存分区中,否则会引起灾难性的后果第二十五页,共三十页,编辑于2023年,星期四第二十六页,共三十页,编辑于2023年,星期四5.2.4查询一个内存分区的状态应用程序可以通过调用函数OSMemQuery()来查询一个分区目前的状态信息。INT8UOSMemQuery(OS_MEM*pmem,//待查询的内存控制块的指针OS_MEM_DATA*pdata//存放分区状态信息的结构指针);调用该函数后,内存分区的状态信息存放到pdata中成功后,返回OS_NO_ERR第二十七页,共三十页,编辑于2023年,星期四第二十八页,共三十页,编辑于2023年,星期四练习试设计一个有3个任务的应用程序,这3个任务分别是MyTask,YouTask和HerTask。在应用程序中创建一个动态内存分区,该分区有8个内

温馨提示

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

评论

0/150

提交评论