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

嵌入式系统试验二扩展的动态内存管理机制电子工程学院余彦培学.DOC

嵌入式系统试验二扩展的动态内存管理机制电子工程学院余彦培学.DOC

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
嵌入式系统试验二扩展的动态内存管理机制电子工程学院余彦培学

嵌入式系统 实验二 扩展的动态内存管理机制 电子工程学院 余彦培 学号:086504 [实验目的] 在了解实时嵌入式操作系统内存管理机制的特点以及实时处理对内存管理需求的基础上,练习并掌握有效处理内存碎片的内存管理机制,同时理解防止内存泄漏问题的良好设计方法。 [实验环境] VxSim [实验原理及要点(知识点)] 实时多任务操作系统(如VxWorks)为保证其时实性,在内存管理方面往往采用最简单有效的方式进行(如malloc/free),但同时会辅以扩展功能(如内存分区- Memory Partition、Cache安全等)以满足用户对内存操作的基本需求。 但实践者应该认识到,在使用操作系统所提供的内存管理机制时,需注意防止其造成的潜在危险,需要形成良好的使用习惯,同时根据应用的特点适当扩展。其关键点在于: 实时系统的内存管理的主要目标为:快速、高效、高可靠; 内存碎片(外部碎片)是危害系统稳定的重要原因之一; 预先规划是达到以上目标的一种良好手段。由于实时系统无法使用复杂的内存管理机制(如垃圾回收等),用户可以根据实时应用使用内存的特点,扩展自己私有的内存管理机制; 内存泄漏的防治主要依赖于内存使用上严谨的编程习惯。 [实验内容] 使用预先规划的思想,构建自己的私有内存管理机制,在系统内存池中申请内存,并将其纳入私有内存管理机制中,形成静态预分配内存池; 静态预分配内存池支持一种以上固定长度内存池,如16字节内存池和256字节内存池。固定长度内存池的单块长度应考虑体系结构开销,并尽量减少内部碎片;固定长度内存池数量应可配置; 静态预分配内存池与系统内存池的统一管理机制。向用户分配内存时应保证长度最佳匹配原则。当申请内存的长度超过静态预分配长度或资源不足时,自动向系统内存池申请; 管理机制包括: 初始化函数; 内存申请/释放函数。并特别要保证释放安全; 告警机制; 管理监视机制。 利用可能的互斥机制或代码可重入设计,保证以上管理机制的操作安全性; 创建多Task环境测试及演示以上内容。 [操作说明及功能描述] 运行程序,在shell中输入progStart启动程序。程序将开始申请大小分别为:44,55,54,76,11,5,4,666的八块内存地址,在申请完成后又分别释放这八块内存。 在VxSim中我们看以看到内存的使用状况如图: 在这里,VxSim中将分别显示出: 任务申请/释放内存大小 内存池1(用于分配申请大小=16时的内存)的剩余可用块个数以及内存池2(用于分配申请大小在16与256之间时的内存)的剩余可用块个数。 申请/释放的内存块的头指针地址。 4,使用内存大小(固定大小16+8或256+8两种,其中8为程序开销)。当申请内存的长度超过256或资源不足时,自动向系统内存池申请。 在shell中输入progStop则删除任务与内存块。释放各种占用的资源。 [程序的实现] 在VxWorks中创建私有的内存管理机制一般有两种途径:一是利用消息队列,将预分配好的内存块的地址依次超某一个消息队列发送,任务在申请内存时只要用msgQRecieve()便可以获得预分配好的那个未用内存块的首地址,同样的在使用完后释放这块内存时只需要msgQSend(),将这块内存空间的地址回送回消息队列即可。二是使用内存分区的方式,通过预分区分配好一系列固定大小的内存块,并通过在头部添加块头的方式来管理这部分内存,在任务申请内存时将将需要分配的内存大小与系统预分配好的内存大小进行最佳的匹配,找出最合适的内存块大小,同样的当释放某块内存时也会跟据这块内存的大小来释放。本次实现使用的是后一种方法,将预分配内存区pool分为pool 1与pool 2,分别拥有大小为16B,256B的内存块(block)各20个,若任务需要分配大于256B的内存,则将直接使用系统的内存分配函数malloc(),释放将使用free()。 [框图说明] [系统中的定义] pool* initial(void); 初始化内存 void* memMalloc(int neededSize); 分配内存,在该函数中判断分配何种内存块 void memFree(void* dataPtr); 释放内存 void memDel(void); 删除内存 void task1(void); 任务函数1,用来创建信号量 void task2(void); 任务函数2,用来测试内存情况 void progStart(void); 启动程序,调用测试函数 void progStop(void); 结束程序,删除Task和内存 SEM_ID semMalloc; SEM_ID semFree;表示定义两信号量,以控制其他函数。 pool ,结构体,用来

文档评论(0)

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

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

1亿VIP精品文档

相关文档