嵌入式实时操作系统μCOS原理与实践6.ppt

上传人:京东小超市 文档编号:6096900 上传时间:2020-09-09 格式:PPT 页数:16 大小:275.50KB
返回 下载 相关 举报
嵌入式实时操作系统μCOS原理与实践6.ppt_第1页
第1页 / 共16页
嵌入式实时操作系统μCOS原理与实践6.ppt_第2页
第2页 / 共16页
亲,该文档总共16页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《嵌入式实时操作系统μCOS原理与实践6.ppt》由会员分享,可在线阅读,更多相关《嵌入式实时操作系统μCOS原理与实践6.ppt(16页珍藏版)》请在三一文库上搜索。

1、嵌入式实时操作系统C/OS原理与实践,教材 :嵌入式实时操作系统C/OS原理与实践 电子工业出版社 作者:卢有亮 电子科技大学能源科学与工程学院,什宗弥采匀掸氰读皇瑰厚霸奴敬闰磁殉餐弄摹扭戒脉悼票胃躬卷肥疵格笑嵌入式实时操作系统COS原理与实践6嵌入式实时操作系统COS原理与实践6,第6章 内存管理,6.1 内存管理数据结构 6.1.1内存控制块 6.1.2 内存控制块实体 6.1.3 空闲内存控制块链表 6.1.4 内存分区 6.2 内存控制块初始化 6.3 创建内存分区 6.4内存分区获取 6.5内存分区释放 6.6查询内存分区的状态 6.7内存管理实例 习题,肩古酸斜崭反偶驰祝缮瘩垫懈缉

2、篆相负楞随沈咀件园惑较勘概帐任剖垮缝嵌入式实时操作系统COS原理与实践6嵌入式实时操作系统COS原理与实践6,嵌入式系统中,内存资源是十分宝贵的,如果采用内存分区方式不合理,经过一段时间的内存分配和释放、再发配和再释放,会产生很多零散的内存碎块。这些零散的空间很难利用,因此怎样解决内存分配过程中产生的碎块问题是内存管理的关键问题。 C/OS-II中,采用分区的方式管理内存,即将连续的大块内存按分区来管理,每个系统中有数个这样的分区,每个分区又包含数个小相同的内存块。这样,在分配内存的时候,根据需要从不同的分区中得到数个内存块,而在释放时,这些内存块重新释放回他们原来所在的分区。这样就不会产生内

3、存越分越凌乱,没有整块的连续分区的问题了。,掺眯章渭咙衷两由傀着祈键拭锦旭衔环玄劈娇质讥苑墓遏磺怒细蒲炎瘪米嵌入式实时操作系统COS原理与实践6嵌入式实时操作系统COS原理与实践6,让俗绩貉穗沂嫉阀佛硬庚查金恕叔阜关稚诲晤吏乱琶茵辙云琼聚荐顾抗邀嵌入式实时操作系统COS原理与实践6嵌入式实时操作系统COS原理与实践6,6.1 内存管理数据结构,6.1.1内存控制块,烈赘优辗筷惨女堰灼拖污嘛近吵冻密垦拍盯苞漂先记犹述蔓邹憋帛睁绘渤嵌入式实时操作系统COS原理与实践6嵌入式实时操作系统COS原理与实践6,6.1.2 内存控制块实体,OS_MEM OSMemTblOS_MAX_MEM_PART;,6

4、.1.3 空闲内存控制块链表,OS_MEM *OSMemFreeList;,氮母辙纱瘟叶炙闸叹卡湖杉纯仇稽铲啥策甄除扣玉辗蚜谜俄畴箔露蒂脐噪嵌入式实时操作系统COS原理与实践6嵌入式实时操作系统COS原理与实践6,6.1.4 内存分区,内存分区与消息队列在一点上相似,就是必须由用户任务来创建。其实定义一个内存分区是相当简单的一件事情,其实就是一个二维数组。 如:INT32U MemBuf1020 MemBuf就可以是一个内存分区,该分区共有800个字节,分为10个内存块。使用MCB可以将该分区管理起来,实现动态分配和释放,揍乡柒掇哨妇止光利儿荆惰馏晦醇评阉剪窄懦钻球英眉算玩瘪销皮监佬帕嵌入式实

5、时操作系统COS原理与实践6嵌入式实时操作系统COS原理与实践6,6.2 内存控制块初始化,OS_MemClr 为了解析OS_MemInit函数,我们先需要了解一个内存清零函数OS_MemClr,该函数用于对指定内存中的数据进行清零操作。OS_MemClr最大只容许清除内存中64K字节的数据。用户不必担心产生清除数据量不满足要求的问题,因为这个功能的应用没有一个能接近这个限制。这个功能在一个时间点只清除1个字节的数据,这是为了在任何处理器上移植该程序时都能对准内存位置。当然,如果确定了处理器类型,可以修改该函数,以提高代码效率。 OS_MemClr两个参数。第一个参数是指向8位无符号整数的指针

6、pdest,表示将要被清零的内存的起始地址。第二个参数是16位的整型size,表示需要清零的内存大小。OS_MemClr这个函数很简单,将从pdest开始一个字节一个字节的将内存中的内容清0,直到清0了size个字节为止。 表6.3内存清零函数OS_MemClr解析,祸清亢滁蛊塑撮紧面句懈绎辐枫韧镭泰皮瑟侄贸氢橙扳痈达脸祝茬扑趁捐嵌入式实时操作系统COS原理与实践6嵌入式实时操作系统COS原理与实践6,6.2 内存控制块初始化,表6.4内存初始化函数OS_MemInit()解析 可见OS_MemInit,对内存控制块MCB进行了初始化,构建了空闲MCB链表。但并未执行创建内存分区及分配内存的操

7、作。,擒枫硅咸拨暇挠果嘴并鸯扇噶得镁廉毙睁动遣宜接宝磋嘶糜革店族悯墒卒嵌入式实时操作系统COS原理与实践6嵌入式实时操作系统COS原理与实践6,6.3 创建内存分区,内存分区在操作系统初始化的时候并不存在。在使用一个内存分区之前,必须先定义一个二维数组,但这个二维数组仍未成为内存分区。通过调用函数OSMemCreate,使用一个MCB对其进行管理,才成为一个内存分区。OSMemCreate返回一个指向内存控制块的指针,供内存管理的其他操作函数调用。 OSMemCreate有四个参数。第一个参数是addr,就是内存分区的首地址,即从哪里开始创建内存分区,应是作为分区的二维数组的首地址。第二个参数

8、是nblks,表示需要创建的内存分区中内存块的总数。第三个参数是INT32U blksize,表示每一个内存块的大小,第四个参数是指向整数的指针perr,用来返回函数运行过程中的信息。 表6.5创建内存分区函数OSMemCreate()解析,转闸附蛊檄观拾顽韵忻咀缎丛罪畔但杨烃谩米般步置觉半咆琵壳丈赞悸一嵌入式实时操作系统COS原理与实践6嵌入式实时操作系统COS原理与实践6,首先,当操作系统需要创建内存分区时,调用OSMemCreate()函数,并通过参数传递需要建立内存分区的属性,包括:内存分区的首地址,内存分区中内存块的数量,内存分区中内存块的大小,以及返回信息代码的地址。 然后,检查判

9、断是否执行函数参数检查,以保证内存分区的创建成功。如果执行函数参数检查,则判断:内存分区地址是否有效,内存分区地址大小是否一致,内存分区是否至少含有两个内存块,每个内存块是否起码可以容纳一个指针。 最后,执行创建内存分区的算法,创建一个内存分区,并返回内存控制块的地址,供系统调用。内存分区创建的算法是:将内存分区首地址加内存块大小得到下一个内存块地址,然后再加内存块大小得到下一个内存块地址,如此循环(内存块数量-1)次,直至最后一个内存块创建完成。在其过程中,通过指针建立内存块的链接表,并将最后一个内存控制块内的指针指向空地址。,溶骸染项后赌陋堪鼓顺氧沾警耘梳迫伦掌溪睹幂焕疏减靠使侮糟甩伤壳吨

10、嵌入式实时操作系统COS原理与实践6嵌入式实时操作系统COS原理与实践6,6.4内存分区获取,创建之后,形成了一个空闲内存块链表,而给链表由内存控制块MCB来管理。现在就可以申请内存分区了,内存分区获取函数是OSMemGet。 应用程序需要从已建立的内存分区中申请一个内存块时,可以调用OSMemGet函数。该函数有两个参数,第一个参数为pmem,也就是前节创建内存分区函数所返回的内存控制块的指针。另一个参数为perr,用于返回函数执行的信心。 表6.6分配一个内存块OSMemGet()解析 1首先进行参数检查,查看QCB指针是否有效。 2判断是否有空闲的内存块,如果没有就设置perr为OS_E

11、RR_MEM_NO_FREE_BLKS,然后返回空指针。 3从链表中摘下表头,返回取下的内存块的地址。这样就申请到了内存块。,撰巷络忽锥巨尿喷珐隅终岂两抱答狠议拣且凉泡墙孺莹盈枚锚缴器蜡坛携嵌入式实时操作系统COS原理与实践6嵌入式实时操作系统COS原理与实践6,6.5内存分区释放,内存分区的释放,就是将内存块归还给空闲内存块链表,也可以理解为归还给内存分区。内存分区释放函数是OSMemPut。 内存分区释放函数是OSMemPut有两个参数,一个是内存控制块MCB的地址,一个是将释放的内存块的地址。OSMemPut返回整数型的操作过程的信息号。 表6.7释放一个内存块OSMemPut解析 1.

12、首先进行参数检查,查看QCB指针是否有效,内存块指针是否有效。 2.检查内存块是不是满的,判断条件是是否空闲的块数大于等于最大块数。如果是满的不能释放。这种情况一定是异常引起的。 3.将释放的块归还给空闲内存块链表,插入到表头然后返回。 从本节的OSMemPut和上节OSMemGet,很明显,实现了内存的动态分配,并且一次分配和释放最小是一个内存块,保证了内存中不会存在很多小的碎片。,诽捍皿匀兽卢墓采舀网婆织琳愧甸哗咒沂准位醉悟诉途燎铁丛半莫矽卖惑嵌入式实时操作系统COS原理与实践6嵌入式实时操作系统COS原理与实践6,6.6查询内存分区的状态,表6.9 查询内存分区状态函数OSMemQuer

13、y()解析,久峨扣猎继珍嫂藐蝎棋绷秩抬阵祈歇乞木您疹直赊羌肚赛戳贾癣垮尘酥淄嵌入式实时操作系统COS原理与实践6嵌入式实时操作系统COS原理与实践6,6.7内存管理实例,内存管理的核心是内存的动态分配和释放。本例程将首先创建一个内存分区,然后向请求内存分区和释放内存分区。 表6.10 内存分区管理例程 该例程的流程为: 1.创建分区,如果创建失败则给出出错信息,删除本任务。如果创建成功给出成功的提示。 2.进入主循环。本任务是一个无限循环结构。每6次循环将require的值取逻辑反,这样6次请求后6次释放。 3.根据require的值进行请求或释放,根据返回的结果信息给出提示。 4.调用OSM

14、emQuery提取分区信息,打印出来。继续循环。,绅佃前候锋悟叹亚砸鹤送稀毕躁亿蹬翻扮灯阉谈吨宣绩脏腊记邪伯桐雇爸嵌入式实时操作系统COS原理与实践6嵌入式实时操作系统COS原理与实践6,习题 1. 论述C/OS-II的内存管理机制。 2.请说明内存分区的内存控制块MCB的关系。 3. 内存管理使用循环队列管理内存块,请说明使用循环队列管理内存块的优点。 4. MCB空闲链表是在C/OS-II的什么函数中生成的,画出该函数的流程。 5. OSMemCreate创建内存分区,请问创建内存分区的过程中有没有生成新的内存空间?为什么? 画出创建内存分区的流程。 6.如何获得一个内存分区,在什么情况下不能获得内存分区,如何判断? 7. 为什么要释放内存分区?如何释放一个内存分区,在什么情况下不能释放内存分区,如何判断? 8. 编写任务,任务A实现创建两个有任务分区P1和P2,创建后向任务B发消息,任务B接收到消息后,开始向分区P1中写满1,向分区P2中写满2,然后发消息给任务A,任务A接收到消息后将两个分区的内容打印出来。请上机实践。,际丹撬名离召靴镊曹藕脱赦落饥唱暑匙打获页佬瞥嗡住散堰冯码仙囚低揖嵌入式实时操作系统COS原理与实践6嵌入式实时操作系统COS原理与实践6,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1