0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

电子设计 来源:互联网 作者:佚名 2018-08-29 09:28 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1 内存管理概述

内存管理是操作系统中心任务之一,其主要任务是组织内存以容纳内核和待执行程序,跟踪当前内存的使用情况,在需要时为进程分配内存,使用完毕后释放并回收内存。目前嵌入式系统中常用的内存管理策略主要有两种--静态内存分配和动态内存分配。

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

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

综上所述,静态内存分配和动态内存分配各有优点,出于嵌入式系统可靠性、实时性及成本、功耗的考虑,如何在两种方案中作出平衡的选择是令嵌入式操作系统设计者头疼的事。一般的嵌入式操作系统都是两种方案的高效结合,μC/OSII也不例外。除此之外,嵌入式操作系统对内存的分配还有以下几点要求:

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

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

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

μ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算法思想、高可靠性的内存管理策略。实验表明,新方案一次创建内存区,即可满足内存块大小需求不均匀的场合,既提高内存分配的灵活性,避免了大量内碎片的产生,又增强了内存分配的可靠性。因此,新方案在可靠性要求高的嵌入式系统中可以得到更好的应用。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • NIOSII
    +关注

    关注

    0

    文章

    59

    浏览量

    28794
  • MMU
    MMU
    +关注

    关注

    0

    文章

    92

    浏览量

    19106
  • Buddy
    +关注

    关注

    0

    文章

    5

    浏览量

    7664
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    CW32F030C8T7永磁同步电机无感FOC控制的方案

    12bit高精度ADC,转换速度快,精度。芯片可靠、强抗静电,强抗干扰等特点,为系统提供了很好的保护功能,能确保系统在恶劣的电磁干扰环境下安全运行。 永磁同步电机无感FOC控制方案
    发表于 12-03 06:34

    C语言的常见算法

    # C语言常见算法 C语言中常用的算法可以分为以下几大类: ## 1. 排序算法 ### 冒泡排序 (Bubble Sort) ```
    发表于 11-24 08:29

    寻求集成度电池驱动方案?剖析SiLM2661CA-DG的独立双使能与边保护架构

    你是否正在为电池管理系统寻找一款紧凑可靠边驱动方案?SiLM2661CA-DG,采用SOP8封装的边NMOS驱动器,以低功耗、
    发表于 09-02 08:26

    灵活高效ZBUFF — C内存数据操作库:优化内存管理的利器

    C语言开发中,高效的内存管理是提升程序性能的关键。ZBUFF作为一款灵活高效的内存数据操作库,通过优化内存分配与释放机制,为开发者提供了更
    的头像 发表于 08-14 18:01 516次阅读
    灵活高效ZBUFF — <b class='flag-5'>C</b><b class='flag-5'>内存</b>数据操作库:优化<b class='flag-5'>内存</b><b class='flag-5'>管理</b>的利器

    灵活高效双引擎驱动:ZBUFF让C语言内存操作更智能!

    ZBUFF库深度融合了智能内存分配算法与实时监测机制,能够自动适应不同场景下的内存需求。其自适应碎片整理功能和错误检测模块,不仅保障了内存使用的高效性,更大幅降低了调试难度,助力开发者
    的头像 发表于 08-11 13:27 432次阅读
    灵活高效双引擎驱动:ZBUFF让<b class='flag-5'>C</b>语言<b class='flag-5'>内存</b>操作更智能!

    SiLM2660CD-DG 边NMOS电池管理驱动芯片的革新设计

    一、核心优势:SiLM2660CD-DG专为电池充放电管理设计,采用边NMOS驱动架构,彻底解决传统方案中\"接地引脚断开导致通信中断\"的风险,确保电池组与主机系统持续稳定
    发表于 07-25 09:13

    可靠功率保护方案来了!稳先微 WINSEMI E-fuse 系列产品震撼发布

    先进的半导体解决方案,今日正式推出E-fuse系列产品—— 以 “精密保护、智能控制” 为核心设计理念,集成高精度保护、浪涌管理、故障诊断于一体,为汽车配电、电池管理系统(BMS)、工业电源等场景提供高
    发表于 06-30 16:21 3556次阅读
    <b class='flag-5'>高</b><b class='flag-5'>可靠</b>功率保护<b class='flag-5'>方案</b>来了!稳先微 WINSEMI E-fuse 系列产品震撼发布

    AWK6943ABTER:车规级可靠电源解决方案

    ​AWK6943ABTER以车规级可靠性+极简设计成为工业/汽车电源首选,其宽压输入、纳米级响应及打嗝式保护技术,为可靠系统提供国产化高性能替代方案
    的头像 发表于 06-16 17:12 789次阅读
    AWK6943ABTER:车规级<b class='flag-5'>高</b><b class='flag-5'>可靠</b>电源解决<b class='flag-5'>方案</b>

    ​数字孪生热管理:NTC热敏电阻阵列与热场重构算法的动态适配

    场重构误差<±0.5℃、响应时间<10ms,并结合某车企电池热管理系统与电机控制单元的实测案例,展现其在复杂工况下的精准温控与能效优化能力,为智能汽车热管理提供高可靠性解决方案
    的头像 发表于 06-06 17:59 610次阅读
    ​数字孪生热<b class='flag-5'>管理</b>:NTC热敏电阻阵列与热场重构<b class='flag-5'>算法</b>的动态适配

    BMS管理方案NRF52833

    电池的智能化管理,同时提高电池使用寿命。通过 BMS 管理方案,结合手机APP、服务器数据统计分析,实现对电池系统的高效、安全和可靠管理,为
    发表于 04-22 14:26

    BMS 管理方案 NRF52833

    电池的智能化管理,同时提高电池使用寿命。通过 BMS 管理方案,结合手机APP、服务器数据统计分析,实现对电池系统的高效、安全和可靠管理,为
    发表于 04-09 16:06

    快速搞懂C语言程序内存分区!

    在程序运行过程中,操作系统会根据程序的需要,将内存划分为多个功能不同的区段,以便更高效地管理内存资源和确保程序的稳定运行。不同的内存区段负责存储不同类型的数据和代码,涵盖了从程序指令、
    的头像 发表于 03-14 17:37 1327次阅读
    快速搞懂<b class='flag-5'>C</b>语言程序<b class='flag-5'>内存</b>分区!

    高效电源管理新选择:LGS5160C同步降压转换器,赋能多领域智能设备

    高压、高可靠性场景的优选方案。其核心优势在于: 高效率与低功耗 支持SKIP/PWM/PFM多模式自适应切换,轻载效率高达85%,重载效率达95%,显著延长电池设备续航。 集成130mΩ
    发表于 02-20 10:05

    广和通发布AI Buddy:创新AI智能终端新品类

    近期,广和通隆重发布了AI Buddy产品及解决方案,这款集智能语音交互、翻译、4G/5G全球漫游、随身热点、智能娱乐及充电续航等功能于一体的智能终端,为用户带来了全新的AI陪伴体验。 AI
    的头像 发表于 01-15 14:50 961次阅读

    广和通发布AI Buddy产品及解决方案,创新AI智能终端

    1月9日,在2025国际消费电子展览会(CES)期间,广和通发布集智能语音交互及翻译、4G/5G全球漫游、随身热点、智能娱乐、充电续航等功能于一体的AI Buddy(AI陪伴)产品及解决方案,创新
    发表于 01-09 13:37 257次阅读
    广和通发布AI <b class='flag-5'>Buddy</b>产品及解决<b class='flag-5'>方案</b>,创新AI智能终端