版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、动态内存管理动态内存管理本章主要讲述:本章主要讲述:基本概念基本概念建立一个内存分区建立一个内存分区分配一个内存块分配一个内存块释放一个内存块释放一个内存块基本概念基本概念应用程序在运行中经常需要临时获得一些内存空间,应用程序在运行中经常需要临时获得一些内存空间,用完后需要归还这些内存空间。用完后需要归还这些内存空间。能否合理、有效地对内存储器进行分配和管理,是能否合理、有效地对内存储器进行分配和管理,是衡量一个操作系统的指标之一。衡量一个操作系统的指标之一。特别地对于实时操特别地对于实时操作系统来说,还应该保证系统在动态分配内存时,作系统来说,还应该保证系统在动态分配内存时,它的执行时间必须
2、是可确定的。它的执行时间必须是可确定的。 C/OS-II对内存进行对内存进行两级管理两级管理: 把一个大片连续的内存空间分成了若干个把一个大片连续的内存空间分成了若干个内存分内存分区区 每个分区又分成了若干个大小相等的每个分区又分成了若干个大小相等的内存块内存块 任务以内存块为单位来获得和释放动态内存。任务以内存块为单位来获得和释放动态内存。 每个内存分区及其内存块的使用情况则由表每个内存分区及其内存块的使用情况则由表内存控制块内存控制块来记录。来记录。创建内存分区前后创建内存分区前后应用程序如果要使用动态内存的话,则要首先在内应用程序如果要使用动态内存的话,则要首先在内存中划分出可以进行动态
3、分配的区域,这个划分出存中划分出可以进行动态分配的区域,这个划分出来区域叫做来区域叫做内存分区内存分区,每个分区要包含若干个,每个分区要包含若干个内存内存块块(C/OS-II要求同一个分区中的内存块的大小必要求同一个分区中的内存块的大小必须相等)。须相等)。在内存中划分一个内存分区与内存块的方法非常简在内存中划分一个内存分区与内存块的方法非常简单:单:先定义一个二维数组,然后基于这个二维数组先定义一个二维数组,然后基于这个二维数组创建一个内存分区就可以了(其中每个一维数组,创建一个内存分区就可以了(其中每个一维数组,即二维数组的一个元素(一行),就是一个内存即二维数组的一个元素(一行),就是一
4、个内存块)。块)。示例示例OS_MEM *PartitionPtr; INT16U MemBuf10010;PartitionPtr = OSMemCreate(Partition,100,10,&err); 上述语句定义了一个内存分区,它有上述语句定义了一个内存分区,它有100个内存块,个内存块,每个内存块的大小为每个内存块的大小为20个字节。个字节。并建立一个把内存控制块与内存分区关联起来,以并建立一个把内存控制块与内存分区关联起来,以便系统能对其进行相应的管理和控制。便系统能对其进行相应的管理和控制。内存控制块内存控制块为了使系统能够感知和有效地管理内存分区,为了使系统能够感知和
5、有效地管理内存分区,C/OS-II给每个内存分区定义了一个叫做内存控制给每个内存分区定义了一个叫做内存控制块(块(OS_MEM)的数据结构。系统就用这个内存)的数据结构。系统就用这个内存控制块来记录和跟踪每一个内存分区的状态。并通控制块来记录和跟踪每一个内存分区的状态。并通过它来申请和释放内存块。过它来申请和释放内存块。内存控制块的结构typedefstructvoid*OSMemAddr;/内存分区的指针void*OSMemFreeList;/内存控制块链表的指针INT32UOSMemBlkSize; /内存块的长度INT32UOSMemNBlks;/分区内内存块的数目INT32UOSMem
6、NFree;/分区内当前可分配的内存块的数目OS_MEM;系统初始化时创建的空内存控制块链表系统初始化时创建的空内存控制块链表创建一个内存分区创建一个内存分区在使用一个内存分区之前,必须先建立一个内存分在使用一个内存分区之前,必须先建立一个内存分区。通过一个二维数组区。通过一个二维数组划分了欲使用的分区和内存划分了欲使用的分区和内存块之后,应用程序可以通过块之后,应用程序可以通过OSMemCreate( ) 建立建立一个内存分区。一个内存分区。OS_MEM *OSMemCreate( void *addr,/内存分区的起始地址内存分区的起始地址 INT32U nblks,/分区中内存块的数目分
7、区中内存块的数目 INT32U blksize, /每个内存块的字节数每个内存块的字节数 INT8U *err /错误信息错误信息);创建内存分区前后创建内存分区前后申请一个内存块申请一个内存块在应用程序需要一个内存块时,应用程序可以通过调用函数OSMemGet()向某内存分区请求获得一个内存块,OSMemGet()函数的原型为:void*OSMemGet(OS_MEM*pmem,/内存分区的指针INT8U*err/错误信息);释放一个内存块释放一个内存块 当应用程序不再使用一个内存块时,必须及时地当应用程序不再使用一个内存块时,必须及时地将它释放。应用程序通过调用函数将它释放。应用程序通过调
8、用函数OSMemPut( )来释放一个内存块,来释放一个内存块,OSMemPut( )函数原型为:函数原型为: INT8U OSMemPut ( OS_MEM *pmem, /内存块所属内存分区的指针内存块所属内存分区的指针 void *pblk /待释放内存块的指针待释放内存块的指针); 内存管理的应用内存管理的应用-消息队列消息队列创建一个内存分区,用该内存分区存放消息队列的创建一个内存分区,用该内存分区存放消息队列的消息内容消息内容内存分区的每一个内存块存放一条消息的内容。内存分区的每一个内存块存放一条消息的内容。INT32U Times;/定义用户任务定义用户任务MyTask、 You
9、rTask的堆栈的堆栈OS_STKMyTaskStkTaskStkSize;OS_STKYourTaskStkTaskStkSize;OS_EVENT *MsgQueue; /定义消息队列指针定义消息队列指针void *MsgQueueTblMAX_MESSAGES; /定义消息指针数组定义消息指针数组 INT8U PartitionMAX_MESSAGESMESSAGE_SIZE;OS_MEM *PartitionPtr; /定义内存分区指针定义内存分区指针 void MyTask(void *pdata) ;void YourTask(void *pdata) ;int main(int
10、argc, char *argv) INT8U err;OSInit();OSTaskCreate(MyTask, 0, &MyTaskStkTaskStkSize-1, 6); OSTaskCreate(YourTask, 0, &YourTaskStkTaskStkSize-1, 5); /创建内存分区,用于保存消息创建内存分区,用于保存消息 PartitionPtr = OSMemCreate(Partition,MAX_MESSAGES,MESSAGE_SIZE,&err); /创建消息队列创建消息队列 MsgQueue = OSQCreate(&Msg
11、QueueTbl0,MAX_MESSAGES); OSStart();return 0;void MyTask(void *pdata) /生产者任务生产者任务 INT8U err,n=0; char *pt; pdata = pdata; while(1) Times+; printf(我是任务我是任务MyTask!已经运行!已经运行 %d次次n,Times); pt = OSMemGet(PartitionPtr,&err); /申请一个内存块存放消息申请一个内存块存放消息 sprintf(pt,MyTask运行次数:运行次数:%d,Times); OSQPost(MsgQueue,pt);/pt为指向消息的指针为指向消息的指针 ,将该指针放到消息队列中,将该指针放到消息队列中 n = (n+1)%10; OSTimeDlyHMSM(0,0,ProduceDelayn,0); void YourTask(void *pdata) /消费者任务消费者任务 INT8U err,m=0; char *pt; pdata = pdata; while(1) pt = (char *)OSQPend(MsgQueue,0,&err); /从邮箱中获得指向消息内容的从邮箱中获得指
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年应急救生系统项目资金需求报告代可行性研究报告
- 2023-2024学年广东省深圳市福田区八年级(下)期末英语试卷
- 2023-2024学年广东省深圳市福田区七年级(上)期中英语试卷
- 二年级数学计算题专项练习
- 健康吃药的安全
- 二年级语文下册教案
- 山东省青岛市李沧区片区2024-2025学年六年级上学期期中语文试卷
- 陕西省西安市蓝田县2024-2025学年上学期九年级物理期中质量检测试卷(含答案)
- 高中物理复习4-2第2讲抛体运动课件
- 医用按摩凝胶产业规划专项研究报告
- 有趣的英国文化
- 皮内注射评分标准
- 上海交通大学学生生存手册
- 治疗药物监测与精准用药
- 施家山隧道瓦斯爆炸演练实施方案
- 市场调查方法-观察法教学课件
- 人教A版高中数学必修第一册《指数函数》评课稿
- 肾内科医疗教学计划
- 中班科学活动勺子里的哈哈镜
- 道路绿化施工图设计说明
- 中小学体育教师晋升高级职称考试题汇编(附答案)
评论
0/150
提交评论