- 1、本文档共32页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
9.1 概述 9.1.1 基本原理 在内存管理方面,ANSI C本身就提供了malloc()和free()两个函数用于动态地分配内存和释放内存。 但是μC/OS-II为什么不直接利用这两个函数,而要另外构建内存管理方法呢?其主要原因在于: 1)当应用程序反复调用malloc()和free()函数进行内存的分配与释放时,可能会将原来一块很大且连续的内存区域,逐渐分割成许多细小而彼此不相邻的内存区域,产生我们通常说的内存碎片。当内存碎片大量存在时,最后应用程序可能连一块很小的内存也无法分配到; 2)由于内存管理算法的原因,malloc()和free()函数的执行时间是不确定的,因此不适合作实时操作系统函数应用。 9.1.1 基本原理 μC/OS-II操作系统的内存管理方法是在解决了malloc()和free()两函数缺陷的基础上构建起来的,其原理如图9.1所示,将内存分区分块,也就是把连续的大块内存分区,每个分区又分成整数个大小相同的内存块。μC/OS-II利用这种新机制,对malloc()和free()函数进行了改进,并构建了新的内存管理函数,使得它们可以分配和释放固定大小的内存块。这样一来,malloc()和free()两函数的执行时间不确定的问题就首先得到了解决。剩下来的问题就是要解决内存碎片的问题了。 如图9.1所示,在有多个分区分块的内存系统中,分配内存时,应用程序可以从不同的内存分区中得到不同大小的内存块。当需要释放时,特定的内存块再重新放回它以前所属于的内存分区。通过这样的内存管理算法,内存碎片问题就得到了解决。 9.1.2 内存管理函数 如表9.1所示,μC/OS-II提供了4种内存管理的函数,函数所属文件是OS_MEM.C。 9.1.3 内存管理函数配置常量 在使用内存管理函数之前,必须将 OS_CFG.H文件中相应的配置常量设置为0或1,以确定是编译还是裁剪该函数,其配置常量如表9.2所示。 9.1.4 内存控制块 内存控制块(MCB:memory control blocks)是用于实现内存管理、跟踪每一个内存分区的数据结构,其定义如程序清单9.1所示,每个内存分区都有它自己的内存控制块。 9.1.4 内存控制块 如果要使用μC/OS-II中的内存管理,要做如下工作: 首先需要将OS_CFG.H文件中将开关量OS_MEM_EN设置为1 然后还要设置OS_MAX_MEM_PART常量,其值至少是2,它定义了系统中的最大分区数。 这样,在启动时μC/OS-II就会通过OSInit()调用OSMemInit()来实现对内存管理器的初始化,该初始化主要建立一个如图9.2所示的空闲内存控制块链表 其中OSMemFreeList指针的作用是将空闲内存控制块链接成空闲内存控制块链表。 9.2 建立内存分区,OSMemCreate() 9.2.1 函数原型 OS_MEM *OSMemCreate( void *addr, INT32U nblks ,INT32U blksize, INT8U *err) OSMemCreate()函数用于建立并初始化一块内存区。 要使用内存管理函数,必先调用OSMemCreate()函数建立内存分区。 一个内存区包含指定数目的、大小确定的内存块,应用程序可以分配这些内存块,并在用完后释放回内存区。 9.2.1 函数原型 OSMemCreate()函数有4个参数: addr 建立的内存区的起始地址。内存区可以使用静态数组或在初始化时使用malloc()函数建立; nblks 需要的内存块的数目。每一个内存区最少需要定义2个内存块; blksize 每个内存块的大小,最少应该能够容纳一个指针; err 是指向包含错误码的变量的指针。OSMemCreate()函数返回的错误码可能为下述几种之一: OS_NO_ERR 内存分区建立成功; OS_MEM_INVALID_ADD 非法地址,即地址为空指针; OS_MEM_INVALID_PART 没有空闲的内存区; OS_MEM_INVALID_BLKS 没有为每一个内存区建立至少两个内存块; OS_MEM_INVALID_SIZE 内存块大小不足以容纳一个指针变量。 OSMemCreate()函数返回指向内存区控制块的指针。如果没有空闲内存区,OSMemCreate()函数返回空指针。 函数的调用者是任务或者启动代码,开关量是OS_MEM_EN。 9.2.2 源代码 OSMemCreate()函数代码如程序清单9.2所示,其主要工作过程如下: 条件检查,确保各种前提条件的满足; 从空闲内存控制块链表中取得一个内存控制块; 若该空闲内存控制块
您可能关注的文档
- 《七年级下册仁爱英语多媒体教学课件》Unit 8 Topic 2 Section D.ppt
- 《七年级下册仁爱英语多媒体教学课件》Unit 8 Topic 3 Section A.ppt
- 《七年级下册仁爱英语多媒体教学课件》Unit 8 Topic 3 Section B.ppt
- 《七年级下册仁爱英语多媒体教学课件》Unit 8 Topic 3 Section C.ppt
- 《七年级下册仁爱英语多媒体教学课件》Unit 8 Topic 3 Section D.ppt
- 《嵌入式操作系统》第1章 嵌入式系统导论.ppt
- 《嵌入式操作系统》第1章-范例.doc
- 《嵌入式操作系统》第2章 嵌入式操作系统中的基本概念.ppt
- 《嵌入式操作系统》第2章-实时系统概念.doc
- 《嵌入式操作系统》第3章-内核结构.doc
- 浙江省绍兴市拔茅中学2021年高二数学文测试题含解析.docx
- 湖北省黄冈市堵城中学高一数学文测试题含解析.docx
- 《数鸭子》ppt课件_原创精品文档.pptx
- 湖北省黄冈市三台中学高二语文上学期期末试卷含解析.docx
- 浙江省舟山市刘圩中学高一地理联考试题含解析.docx
- 湖南省邵阳市广益中学2021-2022学年高一数学文上学期期末试卷含解析.docx
- 湖南省益阳市鱼水中学2021年高二英语期末试题含解析.docx
- 湖南省邵阳市武冈安乐乡中学2020年高一生物模拟试卷含解析.docx
- 浙江省湖州市吴兴高级中学高三数学文下学期期末试卷含解析.docx
- 湖北省孝感市汉川实验高级中学2022年高二语文上学期期末试题含解析.docx
文档评论(0)