Buddy算法的μC/OSII高可靠内存管理方案

最新更新时间:2012-02-15来源: 互联网关键字:Buddy  μC/OSII  高可靠  内存管理 手机看文章 扫描二维码
随时随地手机看文章

1 内存管理概述

  目前嵌入式系统中常用的内存管理策略主要有两种--静态内存分配和动态内存分配。

  静态内存分配: 编译或链接时将所需内存分配好,程序运行起来后所分配的内存不释放。对于实时性和可靠性要求极高的系统,不允许延迟或者分配失效,必须采用静态内存分配的方式。

  动态内存分配: 根据程序执行过程中所需内存的大小而动态分配内存的策略。此方案按需分配内存,避免了静态分配中的内存浪费,灵活性比较强,给程序的实现带来了很大方便。缺点是容易造成内存碎片,且容易造成程序响应不及时等问题。

  嵌入式操作系统对内存的分配还有以下几点要求:

  ① 可靠性。内存分配的请求必须得到满足,如果分配失败可能会带来灾难性的后果。比如,航天飞机的嵌入式操作系统若发生内存分配失效,损失是不可估量的。

  ② 快速性。嵌入式系统对实时性的保证,要求简单、快速地分配内存。

  ③ 高效性。嵌入式系统中内存是一种有限、昂贵的资源,内存分配要尽可能地减少浪费。

  μC/OSII作为一种典型的嵌入式操作系统,其内存管理同样要满足以上3点要求,下面简单介绍μC/OSII的内存管理策略,并分析其不足之处。

  2 μC/OSII动态内存管理方案及不足

  2.1 μC/OSII内存管理方案简介

  μC/OS?II内存管理模块主要由一个数据结构体和5个函数组成:

  ◆ 内存控制块数据结构OS_MEM;

  ◆ 内存分区创建函数OSMemCreate(void *addr, INT32U nblks, INT32U blksize, INT8U *err);

  ◆ 内存块分配函数OSMemGet(OS_MEM *pmem , INT8U *err);

  ◆ 内存块释放函数OSMemPut(OS_MEM *pmem , void *pblk);

  ◆ 内存分区状态查询函数OSMemQuery(OS_MEM *pmem, OS_MEM_DATA *p_mem_data);

  ◆ 内存控制块链表初始化函数OSMemInit(void)。

  μC/OSII用一个内存控制块(OS_MEM)来管理内存分区,主要通过以下4步来管理:

  ① 内存控制块链表初始化函数OSMemInit()负责创建空内存控制块结构的链表,链表长度由内核OS_CFG.H文件中定义的OS_MAX_MEM_PART宏确定。

  ② 内存块创建函数OSMemCreate()先从空内存控制块结构链表上获取一个空的内存控制根块结构,根据用户需要内存块的大小来创建分区。一个分区中含有相同大小的内存块,各内存块也是通过链表链接起来,而不同分区中的内存块大小一般不同,如图1所示的Partition # 1和Partition # 2中内存块的大小是不同的。

  

 

  图1 μC/OSII通过内存控制块管理内存

  ③ 内存块分配函数OSMemGet()通过从内存控制块链表中找到能够满足自己内存块需要的内存控制块,然后从这个内存控制块指向的分区链表首部得到自己需要的内存块。

  ④ 内存块释放函数OSMemPut()负责回收内存块。当应用程序不再使用某一个内存块时,必须及时把它释放,并放回到相应的内存分区中。

2.2 μC/OSII内存管理方案的不足之处

  如前所述,μC/OSII的内存管理方案简短精炼,仅百余行代码,5个函数就能胜任。然而考虑到第1节提到的嵌入式系统对内存管理策略的3个要求,μC/OSII的内存管理策略存在以下不足之处:

  ① 原μC/OSII内存管理方案可靠性不高。因为原方案中各内存分区之间是孤立的,没有联系。一个内存分区上的内存块用完时,不能利用其他分区上的内存块,而只是简单地报错,从而使系统可靠性大大降低。在内存块大小及需求量不确定的场合,如果经常发生内存申请得不到满足的情况,是嵌入式系统所不能容忍的。

  ② 原μC/OSII内存管理方案中内存分配不够灵活。举个例子来说,一个应用程序需要大小为1 KB、512 B、256 B三种内存块,原方案有两种解决方案,一是创建一个内存块大小为1 KB的内存分区,内存块数目至少为3个;二是创建3个内存分区,内存块大小分别为1 KB、512 B、256 B。方案一创建了较少分区,性能有保证,但造成内存资源的浪费;方案二虽然没有浪费内存,但却调用3次OS_MemCreate()函数,效率较低。

  3 Buddy算法简介

  Buddy算法是内存管理的经典算法,目的是为了解决内存的外碎片问题,以及提高内存管理的可靠性。Buddy算法在Linux内核内存管理模块得到成功的应用。

  如图2 所示,Buddy算法将所有空闲页框分组为10个块链表,每个块链表的每个块元素分别包含1、2、4、8、16、32、64、128、256、512个连续的页框,每个块的第一个页框的物理地址是该块大小的整数倍。例如,大小为4个页框的块,其起始地址是4×212(一个页框的大小为4K,4个页框的大小为4×4K,1K=1024=210,4K=212)的倍数。

  

 

  图2 Buddy算法简介

  假设要请求一个128个页框的块,算法先检查128个页框的链表是否有空闲块,如果没有则查256个页框的链表,有则将256个页框的块分裂为两份,一份使用,一份插入128个页框的链表。如果还没有,就查512个页框的链表,有的话就分裂为128、128、256,一个128使用,剩余两个插入对应链表。如果在512还没查到,则返回出错信号。用这种方法来分配页框,由Linux内核的稳定性可知其可靠性。

  回收过程相反,内核试图把大小为b的空闲伙伴合并为一个大小为2b的单独块,满足以下条件的两个块称为伙伴: 两个块具有相同的大小,记做b;它们的物理地址是连续的;第一个块的第一个页框的物理地址是2b×212的倍数。该算法迭代,如果成功合并所释放的块,会试图合并2b的块来形成更大的块。在本方案中,只要满足前两个条件就足够了。

  4 μC/OSII内存管理改进方案

  4.1 改进方案思路

  ① 修改内存控制块的结构OS_MEM,去掉OS_MemAddr、OS_MemNFree成员,添加一个内存块链表尾指针OSMemBlkTail,所以OS_MEM结构还含有4个成员:OSMemFreeList、OSMemBlkSize、OSMemNBlks、OSMemBlkTail。改进后的内存控制块结构如图3所示。

  

 

  图3 改进方案中的内存管理组织结构

  ② 首先初始化一个内存控制块结构数组struct OS_MEM [],其下标是内存块规模的对数,引入结构数组的目的是在申请内存块时能够快速定位,起到索引的作用。而内存块的实际大小为内存块规模与内存块粒度的乘积。然后将内存块按内存块规模从小到大挂到不同结构数组指向的链表上,并且保证初始化后同一链表上的内存块地址不连续。在申请内存块通过内存控制结构数组的下标快速定位到内存块链表,查看内存块控制结构字段中OSMemFreeList成员指针是否为空。若不为空,则从表头取一个内存块,并返回该内存块的地址;否则向后搜索数组,看是否有空闲内存块。若有则将该内存块一分为二,低地址的那块分配给申请者,高地址的那块则挂到前一个结构数组的表头,以备其他申请者申请。同样,释放内存块时也是通过结构数组快速定位到具体结构数组,然后检查该结构数组内存块链表中是否有和要释放的内存块地址连续的内存块。若有,则合并两内存块并挂到后一个结构数组,并检查地址是否连续,直至没有为止;若无,则将该内存块挂到该内存块链表的表尾。改进后的内存管理组织结构如图3所示。

4.2 具体改进措施

  ① 改进函数OS_MemInit(void)。此函数原来是初始化空闲内存控制块链表,改进后此函数用于初始化OS_MEM结构数组即可,根据OS_CFG.H文件中宏OS_MAX_MEM_PART来决定数组元素个数。

  ② 改进函数OSMemCreate(void *addr, INT32U nblks, INT32U granularity , INT8U *err)。根据Buddy的规则横向创建内存块,每创建一个内存块就链到相应的结构体数组上,如图3的Create Direction所示,这样能保证每个结构数组上的相同大小的内存块地址不连续,从而避免了所有内存块合并的现象。创建出来的内存块组织结构如图3所示。

  ③ 改进函数OSMemGet(INT32U size, INT32U granularity, INT8U *err)。因为结构体数组名是在OS_CFG.H文件中宏定义的,所以本函数的参数只包括需求的内存块大小及内存块粒度即可。用内存块大小除以内存块粒度,首先判断所得值是否为2的幂次,若是直接取对数即得结构数组的下标;若不是则取对数后向上取整。得到指定数组元素后若有内存块,取下一内存块然后指针下移,若无内存块则继续搜索下一个结构数组。若该数组有空闲内存块则取将其平分为两块,一块分配出去,一块挂到前面结构数组链表。这样一直搜索到最后一个结构数组,若一直无内存块,则报错返回。

  ④ 改进函数OSMemPut(INT32U size, INT32U granularity)。如何取得结构数组下标值同OSMemGet()函数。在找到所要回收的结构数组后,判断该数组内存块链表上是否有与要回收的内存块连续的地址。若有合并且挂到下一内存块结构数组内存块链表,这样一直到最后一个结构数组,目的是为了保证有更大的内存块可满足应用程序的申请,提高了内存管理的可靠性。

  在改进以上函数的基础上,还可以在申请内存块之前有选择地使用OSMemQuery()查询内存中是否有满足需要的内存块。如果没有则作好相应的规避措施,进一步提高内存管理的可靠性,使系统更稳定。

  5 实验结果及性能分析

  针对改进前后μC/OSII内存管理策略的特点,设计一组具有代表性的测试用例来分析μC/OSII系统在改进前后内存管理的可靠性和灵活性。实验环境为ARM Develop Suit V1. 2及三星公司S3C2440微控制器,由于S3C2440片内包含MMU模块,所以需要将协处理器CP15的C1寄存器0位置0,以禁用MMU功能。

  假设两种方案内存初始化都创建了5个分区,每个分区中所含内存块为10个,且这5个内存分区中的内存块大小依次为16 B、32 B、64 B、128 B、256 B。原方案创建分区时要调用5次OSMemCreate()函数,而改进方案只需调用一次。表1是申请内存块大小与两种方案可以满足的次数之间的关系。

  表1 申请内存块大小与两种方案可以满足的次数比较

  

 

  由表1的数据及图4的对比曲线可看出,改进方案与原方案在可用内存完全相同的情况下,使内存的利用率大大提高。因为可靠性与可满足次数正相关,而可满足次数与曲线与坐标轴围成的面积成正比,所以该面积与可靠性正相关。新方案曲线所围图形面积为12960, 而原方案曲线所围成的图形面积为2400。所以新方案的可靠性将比原来方案提高大约4倍,而且申请内存块越小,可满足次数越多,提高了内存分配的灵活性。

  

 

  图4 两种方案可满足次数对比曲线

  6 结语

  本文的创新之处在于针对μC/OSII在内存管理可靠性不高、内存块分配不够灵活的特点,借鉴Buddy算法思想,对其进行改进,形成了一种基于Buddy算法思想、高可靠性的内存管理策略。实验表明,新方案一次创建内存区,即可满足内存块大小需求不均匀的场合,既提高内存分配的灵活性,避免了大量内碎片的产生,又增强了内存分配的可靠性。

关键字:Buddy  μC/OSII  高可靠  内存管理 编辑:神话 引用地址:Buddy算法的μC/OSII高可靠内存管理方案

上一篇:TE电路保护部推出8款单/多通道硅静电放电保护器件
下一篇:IGBT:走虚拟IDM之路

推荐阅读最新更新时间:2023-10-12 20:35

可靠领域应用FPGA占市场15%
    应借助国家重大科技专项推动国产 FPGA 产业发展,以产业联盟的方式构建完善的国内FPGA产业生态环境。 航天772所是全球领先的宇航微电子整体解决方案的供应商,同时也是专业的电子系统小型化解决方案的供应商。航天772所从2002年开始从事高可靠的FPGA设计、封装、测试及可靠性评估工作,通过10年的发展,形成了一支专业从事高可靠应用的FPGA及PROM研制团队。 航天772所在高可靠和高等级FPGA和PROM设计、封装、测试及应用等方面形成自主核心技术及系列产品,实现了中国自己的“航天百变芯”。 高可靠领域应用FPGA占市场15% 具有完善的封装、测试和可靠性考核条件,才能在高可靠产品的研制和生产
[嵌入式]
可靠交流-直流LED照明驱动设计
  聚辰半导体有限公司近日对外宣布其为交流-直流(AC-DC)LED照明,充电器,适配器,家电电源,辅助电源应用而设计的控制器,GT5010正式大规模量产。聚辰半导体的GT5010是继EERPOM存储器系列和智能卡系列两大产品线之后的电源产品线的又一主力产品。   GT5010采用最新的变压器原边(PSR)控制方式和具有自主专利的全电流反馈控制技术;驱动外部高可靠的MOSFET功率器件;其恒流和恒压特性满足小于±5%范围;用于手机充电器待机功耗小于30mW;转换效率全面满足最新“EPS2.0”;GT5010采用SOT23-6封装;可工作在-40到+85度的温度范围,同时具有过温保护特性等完善的保护特性。这些特性都让GT
[电源管理]
<font color='red'>高</font><font color='red'>可靠</font>交流-直流LED照明驱动设计
绿芯将在德国斯图加特 ADAS和无人驾驶技术博览会上展示可靠固态存储产品
2023年6月6日 - 绿芯将于6月13日至15日在德国新斯图加特展览中心举行的ADAS和无人驾驶技术博览会((ADAS & Autonomous Vehicle Technology Expo),6024展位)上展示用于汽车和交通运输应用的固态存储产品。 PX系列和高耐久性EX系列固态硬盘采用绿芯先进的NAND控制器,支持工业级工作温度范围 (-40oC – 85oC) ,并且经过严格的出厂测试,以满足汽车系统公司的要求: 高耐久性: 搭配EnduroSLC®技术 强大的异常断电数据保护: 防止因异常断电或电源抖动而造成的数据损坏 卓越的数据保持和先进的均衡算法: 最大限度地提高产品使用寿命 性能稳定:
[嵌入式]
绿芯将在德国斯图加特 ADAS和无人驾驶技术博览会上展示<font color='red'>高</font><font color='red'>可靠</font>固态存储产品
可靠DC/DC变换器模块设计
0 引言 目前,在高端电子设备领域,高等级的DC/DC电源模块主要还是依赖国外进口,因此,尽快实现高质量等级DC/DC电源模块国产化迫在眉睫。本文以一种质量等级为H级的DC/DC电源模块的设计为例,从电路、工艺等方面详细介绍了H级DC/DC电源模块的设计思想。 1 模块主要指标 该DC/DC电源模块是为整机配套使用的。其要求的输入电压为20~35V,输出电压为10~10.1V/10~10.2 V(-55℃~+125CIC)、5~-5.1V/5~-5.2 V(一55℃~+125℃),负载调整率和电压调整率均小于1%,输出纹波电压小于40 Mv 2 电路设计 2.1 非平衡双路功率电压输出设计 在DC/
[电源管理]
labview深入探索-----内存管理和缓存重用
使用过常规C语言的朋友都知道,C允许编程者,申请内存,再分配内存和释放内存,这为编程者提供了极大的方便的同时,也造成了非常多的隐患,可以说,C程序的运行中许多莫名其妙的错误都和内存泄露有关.程序可能连续运行几个小时没有任何问题,但突然就发生错误,对于一个比较复杂的程序,追踪内存泄露非常困难,经常要借用第三方的专门的内存分析工具. C的内存错误最多的是两种情况: 1.数组越界: int Array ;//系统自动分配10*4BYTE的空间 for(int i=0;i 100;i++) Array =i; //写入前10个元素时没有问题,超过10个,C会继续向连续的内存空间写数据 如果该内存空间无用,没
[测试测量]
labview深入探索-----<font color='red'>内存管理</font>和缓存重用
高通流、可靠、小型化,维安为5G通讯保驾护航
5G基站是5G网络的核心设备,为5G终端设备联网提供高速率无线接入,实现有线通信网络与无线终端之间的信号传输。由于应用的需要,要求5G基站比3G、4G基站有着更小的体积、更轻的重量、更高的高温可靠性(AAU核心处理单元温度可达120℃以上),故5G基站设备选取的元器件对体积、功耗、可靠性等要求也更加严苛。 维安(WAYON)TP3系列P-TVS具有高通流、高可靠性、小型化等特点,已经在5G设备供应商中大批量供应。 TP3系列产品适用于5G基站电源端口的雷击浪涌防护,可满足1.2/50μs-8/20μs 3kA等级浪涌防护需求。本系列产品在传统的大通流TVS防浪涌器件基
[网络通信]
高通流、<font color='red'>高</font><font color='red'>可靠</font>、小型化,维安为5G通讯保驾护航
工作可靠精度全自动闭口闪点测定仪
  GDBS-305全自动闭口闪点测定仪,以触摸屏代替键盘操作。用于测定石油产品的闭口闪点值。采用国外的先进技术,液晶大屏幕LCD全中文显示人机对话界面,全屏触摸按键提示输入,方便快捷,开放式、模糊控制集成软件,模块化结构,符合国标、美国、欧盟等标准。是理想的进口仪器替代产品。广泛应用于铁路,航空,电力,石油行业及科研部门等。   工作原理   该仪器在国家标准规定的条件下,把试样装入试验杯,对装有试验油的试验杯加热,产生的石油蒸气与周围空气形成的混合气体在与火焰接触发生闪火时的最低温度作为闪点。   数字信号处理器根据所采集的温度变化情况,控制加热器,使试验油温度按一定速率上升;点火时间、闪火检测、实现自动控制;当闪火被
[测试测量]
工作<font color='red'>可靠</font>精度<font color='red'>高</font>全自动闭口闪点测定仪
用AT91 RM9200构建可靠嵌入式系统
   摘要 提出一种基于AT91RM9200处理器的高可靠双机温备解决方案。利用EPlC6、MAX6374设计两个冗余的外部Watchdog监控处理器系统的工作状态,利用AT91RM9200自带的Watchdog作为内部监测机制监控处理器本身的故障;设计并给出了以AT91RM9200为核心的监控机制的具体实现,包括心跳信号的发送和中断服务程序的设计。   本文设计了一种以AT91RM9200处理器为核心的高可靠嵌入式系统。系统具有两台机组,当一台机组发生故障后,另一台机组接管工作并继续运行。系统提供外部和内部Watchdog(看门狗)监控机制构成一级冗余、两级监控的可靠性设计方案。其中外部Watchdog分别采用MAX637
[嵌入式]
小广播
最新模拟电子文章
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved