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

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

3天内不再提示

RT-Thread内存管理的学习过程总结

RTThread物联网操作系统 来源:RTThread物联网操作系统 作者:RTThread物联网操作 2021-03-02 14:13 次阅读

单片机芯片上,如果不考虑出厂固化的ROM空间的话,通常开发者能接触到的存储空间主要分两种:掉电可保存数据的片内FLASH和掉电不可保存数据的片内RAM

片内RAM(通常理解为内存)的访问速度比较快,可以按照变量地址随机访问,但断电后数据丢失。片内FLASH(通常理解为硬盘)所保存的内容比较固定,主要用来保存程序本身的数据内容,保存的内容断电不丢失。

对于单片机的片内RAM内存,主要有堆和栈之分,本章的内存管理,主要是基于堆内存管理进行开展的,在RT-Thread中,有两种堆内存管理方式:动态内存堆管理和静态内存池管理。

本文尝试从以下几个方面总结一下RT-Thread内存管理的学习过程

内存管理相关介绍

在运行操作系统的单片机上面,代码和变量会占用一部分固定的内存开销,操作系统在初始化的时候,会去除掉这部分已经占用的内存,把剩下的闲置内存纳入到系统堆里面进行统一管理,不管是动态堆内存,还是静态内存池,都是使用这部分闲置空间的。

由于在实时操作系统里面对时间的要求十分严格,为了保证内存分配的时候不影响系统的实时性,就需要确保分配内存的时间是确定并可控的;并且在内存分配达到一定次数后,就不可避免地产生内存碎片;与此同时,嵌入式设备的内存资源相对有限,有些系统只有几十KB内存,而有些系统则有几十MB。

所以,为了解决以上内存分配可能出现的问题,需要使用一些内存管理算法来进行这些内存分配管理,RT-Thread提供了两种内存管理方式,分别是:动态内存堆管理和静态内存池管理。

动态内存堆管理

内存堆管理分配主要用于系统动态分配内存的场合,比如,我们使用动态方式创建某些内核对象(如消息队列,邮箱,信号量,等等)的时候,所使用到的内存空间就是动态内存堆。动态内存堆的意思是,要用多少,系统就分配多少给你,不用的时候,就要进行释放,还给系统再进行统一管理。

关于动态内存堆的管理,主要有三种算法:小内存分配算法,slab算法,memheap算法。关于这三种管理算法的实现原理介绍,RT-Thread官方已经给出了比较详细的解释,这里不再重复论述。

c7598cd6-772b-11eb-8b86-12bb97331649.png

需要注意的是,这三种内存管理算法,我们只能通过menuconfig来配置系统内核,选择其中一种内存管理方法,对于用户的应用程序接口而言,这三种算法是透明的,也就是说提供给用户的内存管理接口是相同的,只是算法的实现原理不同。

关于动态堆内存管理,操作系统提供了以下API接口函数,如下图所示。

c81ed086-772b-11eb-8b86-12bb97331649.png

静态内存池管理

在使用动态内存堆管理系统内存的时候,这种方式非常灵活和方便,想用内存的时候就向系统申请分配,不用的时候就释放还给系统,但这种方式也存在一定的弊端。

主要是向系统申请内存的时候,都要遍历一次空闲内存的链表,查找可用的内存块,然后再分配给用户,而且这种方式不可避免地会产生内存碎片,所以这种内存管理方式的效率不是很高。这是一种“用时间换空间”的内存管理方式。

为了提高内存的分配效率,RT-Thread提供了静态内存池管理的方式。静态内存池就是系统把自身管理的内存预先划分为多个固定大小的内存块,当用户需要申请内存的时候,就从这些固定大小的内存块里面申请。

静态内存池管理的方式,还支持线程挂起操作,当系统没有内存块可用时,线程就会挂起等待,直到能申请到可用的内存块,这种特性可以用做线程间同步。

关于静态内存池的工作机制,如下图所示。

RT-Thread提供了以下API函数接口,用于静态内存池管理。

c8eae3ce-772b-11eb-8b86-12bb97331649.png

内存堆和内存池的应用示例

内存管理相关的应用示例,主要是为了验证动态内存堆管理和静态内存池管理相关的API函数接口,这里包含两个示例,分别是内存堆管理示例和内存池管理示例。

示例源码下载链接:

https://github.com/embediot/rtthread_study_notes

https://gitee.com/embediot/rtthread_study_notes

内存堆管理示例会创建一个动态的线程,这个线程会动态申请内存并释放,每次申请更大的内存,当申请不到的时候就结束。例程中分配内存成功并打印信息;当试图申请 65536 byte 即 64KB 内存时,由于开发板的单片机 RAM 总大小只有 64K,而可用 RAM 小于 64K,所以分配失败。

内存池管理示例会创建一个静态的内存池对象,2 个动态线程。一个线程会试图从内存池中获得内存块,另一个线程释放内存块内存块。总共初始化了 4096 /(80+4) = 48 个内存块。

1、线程 1 申请了 48 个内存块之后,此时内存块已经被用完,需要其他地方释放才能再次申请;但此时,线程 1 以一直等待的方式又申请了 1 个,由于无法分配,所以线程 1 挂起;

2、线程 2 开始执行释放内存的操作;当线程 2 释放一个内存块的时候,就有一个内存块空闲出来,唤醒线程 1 申请内存,申请成功后再申请,线程 1 又挂起,再循环一次步骤2;

3、线程 2 继续释放剩余的内存块,释放完毕。

在memory_test.h头文件里面,通过打开相应的宏定义开关,重新编译工程源码,下载到开发板即可验证实验现象,如下图所示。

内存管理相关注意事项

在使用RT-Thread内存管理相关接口的时候,为了确保系统稳定性,有以下注意事项:

1、由于系统为了保证内存在多线程的状态下能安全分配,引入了互斥操作,因此不能在中断服务程序里面分配或释放内存块,否则会引起当前线程被挂起。

2、在使用内存堆管理的时候,产生的内存碎片会在系统空闲线程运行的时候进行回收。

3、用户应用程序在申请内存分配的时候,建议判断是否申请成功,并对申请成功的内存空间进行初始化后再使用。

4、动态内存堆管理是一种“用时间换空间”的内存管理方式,这种方式可以节省一定的内存空间,但会损失一点效率。

5、静态内存池管理是一种“用空间换时间”的内存管理方式,这种方式相对来说比较高效,但会造成一定的空间浪费。

6、对于以KB为单位的单片机片内RAM内存,一般采用动态内存堆里面的小内存管理算法即可。

原文标题:【RT-Thread学习笔记】RT-Thread内存管理学习总结

文章出处:【微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

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

    关注

    8

    文章

    3025

    浏览量

    74041
  • RT-Thread
    +关注

    关注

    31

    文章

    1289

    浏览量

    40121
  • RTThread
    +关注

    关注

    8

    文章

    132

    浏览量

    40875

原文标题:【RT-Thread学习笔记】RT-Thread内存管理学习总结

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    RT-Thread上CAN实践

    开箱测试RT-Thread官方已完成了对英飞凌XMC7200EVK的移植,通过shell可以看到做好了uart3的console。本文将介绍如何进行RT-ThreadCan移植。接下来我们要完成CAN_FD的驱动移植,并正常启动RT-T
    的头像 发表于 11-13 01:03 1178次阅读
    <b class='flag-5'>RT-Thread</b>上CAN实践

    开源共生 商业共赢 | RT-Thread 2024开发者大会报名启动!

    亲爱的RT-Thread开发者我们很高兴地宣布,一年一度的RDC(RT-ThreadDeveloperConference,RT-Thread开发者大会)正式启动报名!2024RT-Threa
    的头像 发表于 10-29 08:06 394次阅读
    开源共生 商业共赢 | <b class='flag-5'>RT-Thread</b> 2024开发者大会报名启动!

    【大连】9月7日RT-Thread巡回线下培训-OpenMV机器视觉

    亲爱的RT-Thread社区成员们:2024年RT-Thread全球开发者线下培训拉开帷幕啦!24年全球巡回培训将覆盖超10座城市及国家,为开发者提供一个深入学习RT-Thread嵌入
    的头像 发表于 09-01 08:02 1462次阅读
    【大连】9月7日<b class='flag-5'>RT-Thread</b>巡回线下培训-OpenMV机器视觉

    2024 RT-Thread全球巡回 线下培训火热来袭!

    亲爱的RT-Thread社区成员们:我们非常高兴地宣布,2024年RT-Thread全球开发者线下培训即将拉开帷幕!24年全球巡回培训将覆盖超10座城市及国家,为开发者提供一个深入学习RT-T
    的头像 发表于 08-07 08:35 1227次阅读
    2024 <b class='flag-5'>RT-Thread</b>全球巡回 线下培训火热来袭!

    RT-Thread 新里程碑达成——GitHub Star 破万!

    RT-Thread实时操作系统开源项目在GitHub上的star数量突破一万!截止发文,RT-Thread作为实时操作系统在业界Star数量排名第一!仓库地址:https://github.com
    的头像 发表于 07-04 08:35 480次阅读
    <b class='flag-5'>RT-Thread</b> 新里程碑达成——GitHub Star 破万!

    6月6日杭州站RT-Thread线下workshop,探索RT-Thread混合部署新模式!

    6月6日下午我们将在杭州举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深
    的头像 发表于 05-28 08:35 445次阅读
    6月6日杭州站<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    2024 RT-Thread 全球技术大会演讲议程发布!

    RT-ThreadGlobalTechConference(RT-ThreadGTC,RT-Thread全球技术大会)致力于围绕RT-Thread基础软件技术发展、实践创新、开发者能力
    的头像 发表于 05-16 08:34 553次阅读
    2024 <b class='flag-5'>RT-Thread</b> 全球技术大会演讲议程发布!

    新书发布——《实时操作系统应用技术:RT-Thread与ARM编程实践》

    ——王宜怀的教授继《嵌入式实时操作系统——基于RT-Thread的EAI&IoT系统开发》之后的又一力作,不仅内容丰富实用,而且讲解方式深入浅出,适合不同层次的学习
    的头像 发表于 05-11 08:35 797次阅读
    新书发布——《实时操作系统应用技术:<b class='flag-5'>RT-Thread</b>与ARM编程实践》

    5月16日南京站RT-Thread线下workshop,探索RT-Thread混合部署新模式!

    5月16日下午我们将在南京举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深
    的头像 发表于 05-01 08:35 371次阅读
    5月16日南京站<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    RT-Thread混合部署Workshop北京站来啦!

    4月25日,下午我们将在北京举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深
    的头像 发表于 04-19 08:34 446次阅读
    <b class='flag-5'>RT-Thread</b>混合部署Workshop北京站来啦!

    4月25日北京站RT-Thread线下workshop,探索RT-Thread混合部署新模式

    4月25日,下午我们将在北京举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深
    的头像 发表于 04-16 08:35 422次阅读
    4月25日北京站<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式

    4月10日深圳场RT-Thread线下workshop,探索RT-Thread混合部署新模式!

    4月10日我们将在深圳福田举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深嵌入式软件工程师农晓明老师为您讲
    的头像 发表于 03-27 11:36 823次阅读
    4月10日深圳场<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    4月10日深圳场RT-Thread线下workshop,探索RT-Thread混合部署新模式!

    4月10日我们将在深圳福田举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深
    的头像 发表于 03-27 08:34 533次阅读
    4月10日深圳场<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    恩智浦半导体正式加入RT-Thread全球合作伙伴计划!

    前不久,恩智浦半导体正式加入RT-Thread全球合作伙伴计划,成为RT-Thread高级会员合作伙伴。同时,RT-Thread现已成为恩智浦注册合作伙伴(RT-Thread| 简介合
    的头像 发表于 03-14 10:40 621次阅读
    恩智浦半导体正式加入<b class='flag-5'>RT-Thread</b>全球合作伙伴计划!

    RT-Thread Studio中的RT-Thread Setting中已经有软件包管理和组件服务管理了,那还需要env工具吗?

    RT-Thread Studio中的RT-Thread Setting中已经有软件包管理和组件服务管理了,那还需要env工具吗,如果也使用env工具那不是和
    发表于 02-23 07:36