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

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

3天内不再提示

嵌入式中是否使用动态内存?

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 作者:黄工的嵌入式技术 2020-02-28 17:03 次阅读

所谓动态内存分配(Dynamic Memory Allocation)就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。

动态内存分配不像数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。

关于静态内存与动态内存

1.1、静态和动态内存的特点
在探讨这个问题之前我们先来对比下静态内存和动态内存的特点:
1. 创建的时间不同:创建的时间不同:静态分配发生在程序编译和连接的时候。动态分配则发生在程序调入和执行的时候。

编译链接过程中已经分配好的

代码运行过程中使用rt_malloc分配:

1staticvoidonmessage_text(rws_socketsocket,constchar*text,constunsignedintlen) 2{ 3char*buff=RT_NULL; 4 5buff=(char*)rt_malloc(2048); 6 7rt_memset(buff,0x00,2048); 8rt_memcpy(buff,text,len); 9 10LOG_D("message(txt),%d(byte):%s",len,buff); 11 12if(buff!=RT_NULL) 13{ 14rt_free(buff); 15} 16}

2. 创建的空间不同:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由函数malloc进行分配。不过栈的动态分配和堆不同,他的动态分配是由编译器进行释放,无需我们手工实现。

1.2、静态和动态内存的优缺点

在了解了静态内存和动态内存不同的特点后可以分析出它们在不同的方面具有不同的优缺点:
1.静态内存编译阶段就分配好了,不会存在分配失败的情况,除非系统内存被分配完了,但是在编译阶段就可以查出。动态内存在运行中分配,在正常运行的情况下可能够正常分配,在某种环境下可能分配失败 ,这样就对开发者的代码水平要求更高,要求开发者需要对代码的健壮性有要求。

2.静态内存由于是编译阶段分配好的,而动态内存是由运行中分配,这样动态内存可以被高效复用,当某段程序使用完毕后,可以将内存交换给内存池中等待下次程序的分配,由于这种机制,开发者可以利用更小的内存开发更大型的程序。

3. 动态内存由于是动态分配,所以涉及到分配和释放的问题,假设X程序在分配了ABC3块内存,程序执行完毕后AC区域内存被释放,但是由于开发者的疏忽导致B区域的内存被遗留。而X程序又是会被反复调用的,这样我们的内存区域由于有没有释放的区域导致每次调用就会占用一段区域,最终系统就没有内存可以使用。这种情况一般在产品实际体现为最开始的时候设备正常工作,但是运行了几个小时或者几天后死机。这种情况一般被称作内存泄漏(Memory Leak)。


4. 在嵌入式RTOS中线程函数中使用静态内存,也就是在线程中定义局部变量,会加大线程栈空间的开销。

裸机开发和RTOS开发的特点

1. 代码规模:裸机开发的项目一般代码规模都比较小,对于一般开发者都难于驾驭使用裸机开发超大规模项目,人力成本和时间成本都太高。反而由于RTOS的模块化特性,更容易开发出代码规模大的项目。


2. 系统稳定性:在机电,航空,汽车等行业都是需要高实时性、高稳定性和高安全性的。对于RTOS来说,系统任务的划分调度都是系统管理,当开发者对其机制了解不清楚的情况下反而带来了部分风险。

除此之外RTOS上的内存管理也是很大影响系统的,对于RTOS上一般不会存在MMU内存管理单元,也就代表大部分运行RTOS的芯片上都没有虚拟地址映射,那么就无法利用物理地址和虚拟地址的特性进行内存整理,避免内存泄漏。所以说在RTOS动态内存这块内存有风险。

嵌入式中是否应该使用动态内存

明白不同内存的优缺点和裸机RTOS的特点之后,我们在回头来分析 “嵌入式中是否应该使用动态内存?”

在实时嵌入式系统中,由于系统软件并不像PC上复杂,一般都是很简单的内存使用,所以一般也不使用动态内存管理,但是随着RTOS面临的任务越来越重,尤其是IoTAIoT的到来,让许多消费级产品运行的RTOS的负担越来越重。

在这种情况下继续使用静态内存开发会极大的限制开发进度,整个开发的灵活性非常低。同时静态的内存无法复用使用同一片内存区域,相比与动态内存在大型项目中一般会使用更多的内存,在内存大小不容乐观的嵌入式系统是很难接受的。

但是针对一些高稳定性和高安全性的项目来说,使用动态内存就需要好好斟酌下,由于RTOS上基本没有MMU的硬件支持或者是系统软件支持,所以不可避免的系统中会出现内存碎片,从而有可能导致系统异常。最终说了这么多总结成以下几点:
1. 没有使用RTOS的项目:不建议使用动态内存,这种项目一般很简单,不必使用动态内存增大系统开销和复杂度。


2. 使用RTOS的消费级项目:建议使用动态内存,一般这种项目代码复杂度比裸机高,合理使用动态内存会有效降低内存的开销。同时很多Github项目的linux程序都是会使用内存管理,有这套机制能更加方便的移植代码。


3. 使用RTOS的军工、航天、医疗等高稳定性和高安全性项目:建议尽量降低对动态内存的使用与依赖以确保系统的稳定性。当然也不代表动态内存就无法在这些项目上使用,只是要求系统开发者对系统内存的把控要求更高。

RT-Thread的内存管理

RT-Thread 操作系统在内存管理上,根据上层应用及系统资源的不同,有针对性地提供了不同的内存分配管理算法。总体上可分为两类:内存堆管理与内存池管理,而内存堆管理又根据具体内存设备划分为三种情况:

第一种是针对小内存块的分配管理(小内存管理算法);
第二种是针对大内存块的分配管理(slab 管理算法);
第三种是针对多内存堆的分配情况(memheap 管理算法)。

小内存管理算法是一个简单的内存分配算法。初始时,它是一块大的内存。当需要分配内存块时,将从这个大的内存块上分割出相匹配的内存块,然后把分割出来的空闲内存块还回给堆管理系统中。每个内存块都包含一个管理用的数据头,通过这个头把使用块与空闲块用双向链表的方式链接起来。


RT-Thread 的 slab 分配器是在 DragonFly BSD 创始人 Matthew Dillon 实现的 slab 分配器基础上,针对嵌入式系统优化的内存分配算法。最原始的 slab 算法是 Jeff Bonwick 为 Solaris 操作系统而引入的一种高效内核内存分配算法。

memheap 管理算法适用于系统含有多个地址可不连续的内存堆。使用 memheap 内存管理可以简化系统存在多个内存堆时的使用:当系统中存在多个内存堆的时候,用户只需要在系统初始化时将多个所需的 memheap 初始化,并开启 memheap 功能就可以很方便地把多个 memheap(地址可不连续)粘合起来用于系统的 heap 分配。

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

    关注

    5068

    文章

    19008

    浏览量

    302990
  • 动态内存
    +关注

    关注

    1

    文章

    24

    浏览量

    7960
  • 静态内存
    +关注

    关注

    0

    文章

    5

    浏览量

    1389
收藏 人收藏

    评论

    相关推荐

    什么是嵌入式?一文读懂嵌入式主板

    在现代科技浪潮嵌入式技术已成为支撑各种智能设备和系统运行的核心力量。那么,究竟什么是嵌入式嵌入式系统,顾名思义,是将计算机的硬件和软件嵌入
    的头像 发表于 10-16 10:14 476次阅读

    【「嵌入式Hypervisor:架构、原理与应用」阅读体验】+全文学习心得

    降低了虚拟机之间的耦合性,提高了系统的可靠性和安全性。 在学习过程,我深刻体会到嵌入式Hypervisor的核心价值在于其灵活性和可扩展性。它能够根据实际应用需求,动态地调整资源配置,满足不同应用场
    发表于 10-09 19:11

    嵌入式主板是什么意思?嵌入式主板全面解析

    嵌入式主板,通常被称为嵌入式系统的核心组件,是一种用于控制和数据处理的计算机硬件,其设计旨在嵌入特定设备执行专门任务。嵌入式主板如同是设备
    的头像 发表于 09-30 10:05 355次阅读

    嵌入式常用数据结构有哪些

    嵌入式编程,数据结构的选择和使用对于程序的性能、内存管理以及开发效率都具有重要影响。嵌入式系统由于资源受限(如处理器速度、内存大小等),
    的头像 发表于 09-02 15:25 380次阅读

    嵌入式系统的实时操作系统

    嵌入式RTOS是嵌入式应用程序运行、相互交互和与外界通信的底层软件机制。在本节,您将了解嵌入式软件开发人员使用哪些流行RTOS以及它们运行的嵌入式
    的头像 发表于 08-20 11:28 438次阅读

    机器视觉在嵌入式的应用

    机器视觉在嵌入式系统的应用是一个广泛而深入的话题,涉及到许多不同的领域和技术。 机器视觉在嵌入式系统的应用 1. 引言 机器视觉是一种模拟人类视觉系统的功能,通过图像采集、处理和分
    的头像 发表于 07-16 10:30 442次阅读

    提升嵌入式系统可靠性的有效策略

    嵌入式工程师来说一个很大的好处是,我们的IDE和工具链可以自动产生应用程序或内存空间校验和(Checksum),从而根据这个校验和验证应用程序是否完好。有
    发表于 04-26 14:50 464次阅读
    提升<b class='flag-5'>嵌入式</b>系统可靠性的有效策略

    你知道吗? 51单片机也有动态内存分配

    一、简述其实在51单片机也可以使用动态内存动态内存其实就是划出一块内存区域,将这块内存进行管理,称为
    的头像 发表于 04-26 08:10 1354次阅读
    你知道吗? 51单片机也有<b class='flag-5'>动态内存</b>分配

    嵌入式fpga是什么意思

    嵌入式FPGA是指将FPGA技术集成到嵌入式系统的一种解决方案。嵌入式系统是一种为特定应用而设计的计算机系统,它通常包括处理器、内存、外设
    的头像 发表于 03-15 14:29 1188次阅读

    C语言中的动态内存管理讲解

    本章将讲解 C 动态内存管理。C 语言为内存的分配和管理提供了几个函数。这些函数可以在 头文件中找到。
    的头像 发表于 02-23 14:03 365次阅读
    C语言中的<b class='flag-5'>动态内存</b>管理讲解

    嵌入式学习步骤

    语言编写。但是,有些嵌入式系统也使用其他编程语言,例如Python或Java。 (3).了解硬件:深入了解您要控制的硬件设备的功能和特性。您需要了解嵌入式系统的处理器、内存、I/O端口、传感器和其他
    发表于 02-02 15:24

    高端嵌入式实验平台

    微处理器、内存芯片组、闪存芯片组和电源管理电路,扩展板则由嵌入式硬件接口、板载功能和扩展功能模块组成。 软件提供嵌入式主流Andriod和Linux双系统软件包,开放的资源满足教学、科研、创新等应用,并提成配套实验教程。 该平台
    的头像 发表于 01-29 09:55 486次阅读
    高端<b class='flag-5'>嵌入式</b>实验平台

    嵌入式系统堆栈监控的作用

    在微控制器或微处理器,堆栈是内存的一个保留区域,用于存储临时数据和函数调用信息,管理函数的执行,跟踪返回地址、局部变量和函数参数。堆栈监控是嵌入式系统运行起关键作用的一项安全措施,
    的头像 发表于 01-05 11:13 463次阅读

    什么是嵌入式系统?嵌入式系统的具体应用

    嵌入式,一般是指嵌入式系统。用于控制、监视或者辅助操作机器和设备的装置。
    的头像 发表于 12-20 13:33 2383次阅读

    嵌入式C语言高手炼成之内存操作篇

    嵌入式系统的编程,常常要求在特定的内存单元读写内容,汇编有对应的MOV指令,而除C/C++以外的其它编程语言基本没有直接访问绝对地址的能力。在嵌入式系统的实际调试
    的头像 发表于 12-11 17:20 485次阅读