下载

0下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 [优质文档]平板式内存治理

[优质文档]平板式内存治理.doc

[优质文档]平板式内存治理

熊严贵
2018-04-13 0人阅读 举报 0 0 0 暂无简介

简介:本文档为《[优质文档]平板式内存治理doc》,可适用于职业岗位领域

优质文档平板式内存治理平板式内存管理谢国经(广东海洋大学,,,,,电子信息工程班,湛江市,,,,,,,,,,)Flat,,,,,memory,,,,,managementXie,,,,,Guo,,,,,Jing(Department,,,,,of,,,,,,,,,,Electronic,,,,,Engineering,,,,,of,,,,,Guangdong,,,,,Ocean,,,,,University,,,,,,ZhanJiang,,,,,,,,,,,ChinaAbstract:,,,,,Memory,,,,,management,,,,,There,,,,,are,,,,,many,,,,,ways,,,,,,of,,,,,this,,,,,paper,,,,,is,,,,,not,,,,,a,,,,,si*mple,,,,,chip,,,,,MMU,,,,,memory,,,,,management,,,,,This,,,,,planar,,,,,main,,,,,memory,,,,,management,,,,,system,,,,,with,,,,,a,,,,,simple,,,,,multitasking,,,,,Although,,,,,the,,,,,memory,,,,,management,,,,,there,,,,,are,,,,,a,,,,,lack,,,,,of,,,,,flexibility,,,,,,but,,,,,achieving,,,,,very,,,,,simple,,,,,,and,,,,,portability,,,,,is,,,,,very,,,,,strong,,,,,Therefore,,,,,,there,,,,,is,,,,,no,,,,,memory,,,,,management,,,,,unit,,,,,MMU,,,,,chips,,,,,are,,,,,widely,,,,,used,,,,,This,,,,,article,,,,,gives,,,,,concrete,,,,,realization,,,,,of,,,,,the,,,,,source,,,,,codeKey,,,,,words:*,,,,,Memory,,,,,management,,,,,operating,,,,,system摘,,,,,,,,,,要:*内存管理的方法有很多种~本文论述的是没有MMU芯片上的一种简单的内存管理方式。这种平面式的内存管理方式主要用简单的多任务系统。这种内存管理方式虽然在灵活性上有欠缺~但实现十分简单~而且移植性非常的强。因此在没有内存管理单元MMU的芯片中得到广泛的应用。本文将给出具体实现的源代码。关键词:*内存管理,操作系统,为什么需要平板式的内存管理方式内存管理是操作系统的重要组成部分内存管理是否高效直接影响到任务运行的效率。但可惜的是内存管理的方式很多情况受到硬件的限制一些高级芯片或系统有MMU硬件单元可以容易的实现分段、分页的内存管理方式可以跑多进程的操作系统像我们的PC机就是一个很好的例子。具有MMU的片上系统不少但在很多场合并不需要那么高级的芯片。比如以ARM为内核的很多芯片(如LPCX)足可以做很多的嵌入式产品不仅降低了开发成本而且还使得开发难度降低开发周期变短。在这样的实际需求下针对没有MMU片上系统的平板式内存管理方式应运而生。平板式内存管理方式基本思想操作系统用一个链表管理着系统空闲的内存块。当任务向系统申请内存块的时候任务就会调用相应的系统函数并以要申请的内存块大小作为参数系统函数会在这个空闲的内存链表中查找对应大小的内存块如果成功的查找到对应大小的内块函数就会返回这个内存块的地址并把这个内存块从系统内存空闲链表中取下来。如果查找不到符合要求的内存块函数就会返回空指针表示申请不到内存块。再分细一点又可以分为两种方式一种是分配内存块的大小由函数参数传过来系统根据这个参数在链表中找另外一种是同一个链表中的内存块大小是相等的需要不同大小的内存块要在不同的链表中申请。下面分别对这两种方式做详细介绍。任意大小分配方式刚开始时系统空闲内存链表是一块很大块的内存A经过几次分配插入后内存变得大小不一B有的变成了无法再用的碎片C图,,,,,任意大小分配方式这种可以分配任意大小的内存管理方式系统用一个指针指向这块很大的内存块如果有任务需要向系统申请内存块的时候就会在这块大的内存块中查找如果查找不到对应大小的内存块就会尝试去把大块的内存块分成两块然后取合适的那块返还给用户剩下的放到空闲链表中等待别的任务申请。当任务把以前申请到的内存块归还给系统的时候系统会尝试把这块内存和链表中某块空闲的内存块组成一块连续的内存块如果不能合并就会把这块内存块当作一个独立的节点放到内存空闲链表中。以上这样的分配和释放方式会很容易产生一个问题系统在经过多次分配和释放内存后会形成很多细小的内存块这样的内存块即不能组成连续的内存块也不能满足任务的需要因此会导致内存的泄漏。内存的泄漏使得本来已经捉襟见肘的内存资源变得更加的紧张了。在图中有A、B、C三个指针他们指向系统空闲的内存块实际上他们是同一个只是在不同的时间他们的表现形态不一样。A表示在系统开始时管理的内存块B表示经过几次分配后的空闲内存链表C就是经过很多次分配回收后的系统空闲内存示意图。这样的内存管理方式申请和回收都要经过很长时间的运算而且运算时间不是常数因此不适合硬实时的嵌入式系统。这样的内存管理方式虽然比较灵活但由于存在这样的问题本文不给出这种内存管理方式的实现代码。下面介绍另外一种更加适合硬实时系统的平板式内存管理方式。固定大小分配方式空内存指针闲内存块图固定大小分配方式固定大小分配方式不仅实现起来容易而且实时性十分的高。这样的内存管理是预先把一大块的内存分配成固定大小的内存块然后把他们连接成一个链表。这样当任务向系统申请内存块的时候任务要把这个空闲内存的头指针作为参数传给系统系统就会在这个链表中查找一块内存块返回给用户如果链表是空的就返回表示申请失败。当任务释放内存块的时候就要确定两个参数第一个是要归还系统内存块的首地址第二个是内存空闲链表的首地址。这样看起来真的会有点抽象在看完下面的代码后再回过头来看这个文字相信你会有更加深刻的理解。平板式内存管理方式具体实现固定大小分配方式主要用三个函数来实现OSMemCreate()是把一大块内存分成固定大小的块并把他们组成一个链表返回头指针。OSMemApply()向系统申请一个内存块函数。OSMemRelease()释放申请到的内存块。下面分别给出具体实现。切割内存块void,,,,,,,,,,*OSMemCreate(void,,,,,*,,,,,Addr,uint,,,,,NumCake,uint,,,,,,,,,,CakeSize){int,,,,,ivoid,,,,,,,,,,**TempLinkuint,,,,,,,,,,*TempLinkif(Addr,,,,,==,,,,,),,,,,,,,,,return,,,,,,,,,,if(NumCake,,,,,==,,,,,),,,,,,,,,,return,,,,,,,,,,AddrTempLink,,,,,=,,,,,(void**)Addr指向数组首地址TempLink,,,,,=,,,,,(uint*)Addr,,,,,,,,,,CakeSize移动CakeSizefor(,,,,,i,,,,,=,,,,,,,,,,i,,,,,<,,,,,NumCake,,,,,,,,,,,,,,,,,,,,i){*TempLink,,,,,=(void,,,,,*)TempLink保存下一个内存块到前一个内存块开头,,,,,TempLink,,,,,=,,,,,(void**)TempLink移动指针指向下一个内存块TempLink,,,,,=,,,,,TempLink,,,,,CakeSize移动CakeSize}*TempLink,,,,,=,,,,,(void,,,,,*)return,,,,,,,,,,Addr}这个函数有三个参数void,,,,,*,,,,,Addr是将要进行切割的内存块首地址在执行这个函数后者块内存就会按照后面两个参数的要求切割成若干块。uint,,,,,NumCake是链表中内存块的数量执行函数后链表中将会有NumCake,,,,,块空闲内存块。uint,,,,,,,,,,CakeSize,,,,,是每一块内存的大小。申请内存块void,,,,,*OSMemApply(void,,,,,*MemPtr){void,,,,,*TempLinkif(MemPtr,,,,,==,,,,,),,,,,,,,,,,,,,,return,,,,,,,,,,TempLink,,,,,=,,,,,MemPtr获得第一块MemPtr,,,,,=,,,,,*(void**)TempLink移动指针从链表中删除已经申请了的内存块return,,,,,,,,,,TempLink}申请内存块实际上就是进行一个链表的删除操作。释放内存块int,,,,,,,,,,,,,,,OSMemRelease(void,,,,,*MemPtr,void,,,,,*CakePtr){*(void**)CakePtr,,,,,=,,,,,,,,,,MemPtrMemPtr,,,,,=,,,,,CakePtrreturn,,,,,OSOK}把内存块归还系统时间上就是进行链表的一个插入操作。应用图文说明在多任务系统中常常需要进行任务之间的通信承载信息需要内存因此在这样的情况下可以向系统申请一块内存然后写入要发送的信息并把这这块消息发送到别的任务任务收到消息并处理完后就可以把这块内存块归还系统。等待别的任务使用。以上文字描述的过程用图来表达就是图所示。TASK消息队列、TASK、处理完消、取消息、向TASK发送TASK息后归还消息把消息内存块内容写进内存承载块并发消息、送、申的内归还请内存块内存存块块空闲空闲空闲空闲内存指针内存内存内存内存块块块块图动态内存分配应用举例代码实现全局变量的定义:#include,,,,,"configh"#define,,,,,,,,,,Message,,,,,,,,,,,,,,,OSSTK,,,,,,,,,,,,,,,UsrStk任务堆栈void,,,,,*UsrMemPtr系统空闲内存块头指针int,,,,,UsrMem系统总的内存块大小OSTASK,,,,,*UsrTaskPtr保存任务ID消息处理函数:void,,,,,UsrHandleMsg(void,,,,,*Msg){处理消息函数}任务申请内存块并向任务发送消息:void,,,,,TaskMem(void*Pd){int,,,,,*TaskMemPtrwhile(){,,,,,,,,,,,,,,,if((TaskMemPtr,,,,,=,,,,,OSMemApply(UsrMemPtr)),,,,,!=,,,,,){申请内存块,,,,,,,,,,,,,,,*TaskMemPtr,,,,,=,,,,,Message申请成功就写进要发送的消息,,,,,,,,,,,,,,,OSTaskMsgPost(UsrTaskPtr,TaskMemPtr,,,,,,)发送消息到任务,,,,,,,,,,,,,,,},,,,,,,,,,,,,,,}}任务接收任务发来的消息处理并释放内存块:void,,,,,TaskMem(void*Pd){int,,,,,*TaskMemPtrwhile(){if((TaskMemPtr,,,,,=,,,,,,,,,,OSTaskMsgPend()),,,,,!=,,,,,){取任务发送过来的消息UsrHandleMsg(TaskMemPtr)取到消息就处理消息,,,,,,,,,,,,,,,OSMemRelease(UsrMemPtr,TaskMemPtr)归还内存块到系统,,,,,,,,,,,,,,,},,,,,,,,,,,,,,,}}主函数启动系统并创建任务创建空闲内存链表。int,,,,,main,,,,,(void){,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OSSystemInit(),,,,,系统初始化,,,,,,,,,,,,,,,,,,,,,,,,,UsrMemPtr,,,,,=,,,,,OSMemCreate(UsrMem,,)切割大块的内存为块每块为字节,,,,,,,,,,,,,,,,,,,,,,,,,UsrTaskPtr,,,,,=,,,,,OSTaskCreate(TaskMem,,,,,,,,,,,,,,,,,UsrStk,,,,,,)创建任务,,,,,,,,,,,,,,,,,,,,,,,,,UsrTaskPtr,,,,,=,,,,,OSTaskCreate(TaskMem,,,,,,,,,,,,,,,,,UsrStk,,,,,,)创建任务,,,,,,,,,,,,,,,,,,,,,,,,,OSStart()进入多任务环境,,,,,,,,,,,,,,,,,,,,,,,,,while(),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,return,,,,,}致谢,,,,,,,,,,*感谢王峰老师感谢王峰老师一直以来给我的细心指导感谢宿舍的朋友们给了我安静的学习环境。,,,,,参考文献:周立功等,,,,,,,,,,,,,,,,,,,,ARM微控制器基础与实践(第版)年周立功,,,,,张华,,,,,等,,,,,深入浅ARMLPCxLPCx(上册)年美JeanJLabrosse,,,,,嵌入式实时操作系uCOSII(第版)年谢国经,,,,,()男广东中山人本科广东海洋大学信息学院学生主要研究基于ARM的嵌入式实时操作系统

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

评分:

/10

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利