第五章动态内存管理.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

第1页,共30页,星期日,2025年,2月5日第五章动态内存管理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查询一个内存分区的状态第2页,共30页,星期日,2025年,2月5日5.1内存控制块uC/OS-II对内存斤西瓜两级管理,即把一个连续的内存空间分为若干个分区,每个分区又分为若干个大小相等的内存块。操作系统以分区为单位来管理动态内存,而任务以内存块为单位来获得和释放动态内存。内存分区及内存块的使用情况则由内存控制块来记录第3页,共30页,星期日,2025年,2月5日5.1.1可动态分配内存的划分1.内存块:uC/OS-II以内存块为单位向应用程序提供动态内存。内存块的大小可由用户定制2.内存分区:大小相等的多个内存块可以组成一个内存分区。内存分区是系统对内存进行管理的基本单位3.内存分区与内存块的定义:在内存中定义一个内存分区及其内存块的方法很简单,只要定义一个二维数组即可如:INT16UIntMemBuf[10][10]第4页,共30页,星期日,2025年,2月5日上面定义的只是在内存中划分出了分区及内存块的区域,还不是一个真正的可以动态分配的内存区(如图5.1a)只有把内存控制块与分区关联起来之后,系统才能对其进行相应的管理和控制,才是一个真正的动态内存区(如图5.1b)第5页,共30页,星期日,2025年,2月5日5.1a没有控制块时的分区b有控制块时的分区第6页,共30页,星期日,2025年,2月5日5.1.2内存控制块OS_MEM的结构为了是系统能够感知和有效管理内存分区,uC/OS-II定义了一个叫做内存控制块(OS_MEM)的数据结构。系统就用这个内存控制块来记录和跟踪每一个内存分区的状态第7页,共30页,星期日,2025年,2月5日内存控制块的内存分区指针OSMemAddr指向了内存分区,内存分区中的各个内存块又组成了一个单项链表,内存控制块的链表指针OSMemFreeList就指向了这个单向链表的头内存控制块的其他3个变量分别记录了分区中内存块的长度,总数目以及现在还为被分配的内存块数目第8页,共30页,星期日,2025年,2月5日5.1.3空内存控制块链表与uC/OS-II其他控制块一样,在uC/OS-II初始化时,会调用内存控制块的初始化函数OS_MemInit()定义并初始化一个空内存控制块链表在这个空内存控制块链表中,一共有OS_MAX_MEM_PART(在文件OS_CFG.H中定义的常数)个空内存控制块。这些空内存控制块的指针成员OSMemFreeList暂时作为指向下一个空内存控制块的指针第9页,共30页,星期日,2025年,2月5日空内存控制块链表第10页,共30页,星期日,2025年,2月5日每当应用程序需要创建一个内存分区时,系统就会从空内存控制块链表中摘取一个控制块,而把链表的头指针OSMemFreeList指向下一个空内存控制块每当应用程序释放一个内存分区时,则会把该分区对应的内存控制块归还给空内存控制块链表第11页,共30页,星期日,2025年,2月5日5.2动态内存的管理用于动态内存管理的函数有:创建动态内存分区函数请求获得内存块函数释放内存块函数查询动态内存分区状态函数第12页,共30页,星期日,2025年,2月5日5.2.1创建动态内存分区应用程序可以通过OSMemCreate()来建立一个内存分区OS_MEM*OSMemCreate(void*addr, //内存分区的起始地址INT32Unblks, //分区中内存块的数目INT32Ublksize, //每个内存块的字节数INT8U*err //错误信息)第13页,共30页,星期日,2025年,2月5日第14页,共30页,星期日,2025年,2月5日在各类判断条件中有两个问题值得注意:1.分区的内存块至少有两块2.每个内存块的空间至少能存放一个指针,因为要在内存块中建立一个用于把分区内的内容块连接为一个链表的指针第15页,共30页,星期日,2025年,2月5日例如:5.1建立一个含有50个内存块并且每块的长度为64字节的内存分区。试写出主要代码:第16页,共30页,星期日,2025年,2月5日//定义全局变量OS_MEM*CommTxBuffer; //定义内存分区指针INT8UCommTxPart[50][64]; //定义分区和内存

文档评论(0)

xiaozhuo2022 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档