网站大量收购闲置独家精品文档,联系QQ:2885784924

(嵌入式实时操作系统uC OS-2教程)第9章内存管理.ppt

(嵌入式实时操作系统uC OS-2教程)第9章内存管理.ppt

  1. 1、本文档共60页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第9章 内 存 管 理 9.1 概 述 9.1.1 基本原理   在内存管理方面,ANSI C本身就提供了malloc()和free()两个函数用于动态地分配内存和释放内存。但是,μC/OS-Ⅱ为什么不直接利用这两个函数,而要另外构建内存管理方法呢,其主要原因在于以下两个方面:   (1) 当应用程序反复调用malloc()和free()函数进行内存的分配与释放时,可能会将原来一块很大且连续的内存区域逐渐分割成许多细小而彼此不相邻的内存区域,产生通常说的内存碎片。当内存碎片大量存在时,最后应用程序可能连一块很小的内存也无法分配到。   (2) 由于内存管理算法的原因,malloc()和free()函数的执行时间是不确定的,因此不适合作实时操作系统函数应用。 μC/OS-Ⅱ操作系统的内存管理方法是在解决了malloc()和free()两函数缺陷的基础上构建起来的。其原理如图9.1所示,将内存分区分块,也就是把连续的每个大块内存分区,  图9.1 内存分区   每个分区又分成整数个大小相同的内存块。μC/OS-Ⅱ利用这种新机制,对malloc()和free()函数进行了改进,并构建了新的内存管理函数,使得它们可以分配和释放固定大小的内存块。这样一来,malloc()和free()两函数的执行时间不确定的问题就首先得到了解决。接下来就是要解决内存碎片的问题。如图9.1所示,在有多个分区分块的内存系统中,分配内存时,应用程序可以从不同的内存分区中得到大小不同的内存块。当需要释放时,特定的内存块再重新放回它以前所属的内存分区。通过这样的内存管理算法,内存碎片问题就得到了解决。 9.1.2 内存管理函数   如表9.1所示,μC/OS-Ⅱ提供了四种内存管理函数,函数所属文件是OS_MEM.C。   9.1.3 内存管理函数的配置常量   在使用内存管理函数之前,必须将 OS_CFG?.H文件中相应的配置常量设置为0或1,以确定是编译还是裁剪该函数,其配置常量如表9.2所示。 9.1.4 内存控制块   内存控制块(Memory Control Blocks,MCB)是用于实现内存管理、跟踪每一个内存分区的数据结构,如程序清单9.1所示,每个内存分区都有它自己的内存控制块。   程序清单9.1 内存控制块的数据结构 typedef struct { void *OSMemAddr; /*指向内存分区起始地址的指针。它在建立内存分区时被初始化, 此后不能更改(见9.2节) */ void *OSMemFreeList; /*指向下一个空闲内存控制块或下一个空闲内存块的指针,具体含义 要根据该内存分区是否已经建立来决定(见9.2节) */ INT32U OSMemBlkSize; /*内存分区中内存块的大小,是用户在建立该内存分区时指定的 */ INT32U OSMemNBlks; /*内存分区中总的内存块数量,是用户在建立该内存分区时指定的*/ INT32U OSMemNFree; /*内存分区中当前可以使用的空闲内存块数量 */ } OS_MEM;   如果要使用μC/OS-Ⅱ中的内存管理,首先需要将OS_ CFG?.H文件中的开关量OS_MEM_EN设置为1;然后还要设置OS_MAX_MEM_PART常量,其值至少是2,它决定了系统中的最大分区数。这样,在启动时μC/OS-Ⅱ就会通过OSInit()调用OSMemInit()来实现对内存管理器的初始化。该初始化主要建立一个如图9.2所示的空闲内存控制块链表,其中OSMemFreeList指针的作用是将空闲内存控制块链接成空闲内存控制块链表。 图9.2 空闲内存控制块链表   9.2 建立内存分区——OSMemCreate() 9.2.1 函数原型   函数原型如下:   OS_MEM *OSMemCreate(void *addr, INT32U nblks ,INT32U blksize, INT8U *err)   OSMemCreate()函数用于建立并初始化一块内存区。要使用内存管理函数,必先调用OSMemCreate()函数建立内存分区。一个内存区包含确定数量和大小的内存块,应用程序可以分配这些内存块,并在用完后释放回内存区。   OSMemCreate()函数有如下四个参数:   (1) ?addr:建立的内存区的起始地址。内存区可以使用静态数组或在初始化时使用malloc()函数建立。   (2) ?nblks:内存块的数量。每一个内存区最少需要定义两个内存块。   (3) ?blksize:每个内存块的大小,最少应该能够容纳一个指针。   (4) ?err:指向错误代码的

文档评论(0)

autohhh + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档