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

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

3天内不再提示

静、动态内存的优劣比较

RTThread物联网操作系统 来源:YXQ 2019-08-06 18:25 次阅读

关于静态内存与动态内存

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

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

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

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 管理算法)。

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

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

    关注

    1

    文章

    24

    浏览量

    8013
  • 静态内存
    +关注

    关注

    0

    文章

    5

    浏览量

    1405

原文标题:嵌入式中是否应该使用动态内存?

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

收藏 人收藏

    评论

    相关推荐

    串联电路与并联电路的优劣比较

    串联电路与并联电路各有其优劣,具体如下: 串联电路的优势: 电流相同:串联电路中,流过每个元件的电流是相同的,这使得在需要控制电流的应用中很有用。 简化电路设计:在某些情况下,串联电路的设计和实现
    的头像 发表于 12-02 17:32 1347次阅读

    Prolith和HyperLith的优劣

    Prolith和HyperLith在光刻领域的优劣势,可以展开讨论讨论
    发表于 11-29 22:12

    DDR内存与SDRAM的区别 DDR4内存与DDR3内存哪个好

    DDR内存与SDRAM的区别 1. 定义与起源 SDRAM (Synchronous Dynamic Random Access Memory) :同步动态随机存取存储器,是一种早期的内存技术,它与
    的头像 发表于 11-29 14:57 1174次阅读

    DDR内存的工作原理与结构

    DDR内存,全称为Double Data Rate Synchronous Dynamic Random Access Memory(双倍数据速率同步动态随机存取内存),是一种用于计算机和其他
    的头像 发表于 11-20 14:32 942次阅读

    Linux内存泄露案例分析和内存管理分享

    内存报警的消息,让整个团队都比较紧张,我们团队负责的LB服务是零售、物流、科技等业务服务的流量入口,承接上万个服务的流量转发,一旦有故障影响业务服务比较多,必须马上着手解决内存暴涨的问
    的头像 发表于 10-24 16:14 793次阅读
    Linux<b class='flag-5'>内存</b>泄露案例分析和<b class='flag-5'>内存</b>管理分享

    如何评判电子烟PCBA方案优劣

    如何评判电子烟方案优劣
    的头像 发表于 10-16 16:21 678次阅读
    如何评判电子烟PCBA方案<b class='flag-5'>优劣</b>

    内存时钟和内存条有什么不同

    在探讨内存时钟(Memory Clock)和内存条(Memory Module)的不同时,我们首先需要明确这两个概念的基本定义和它们在计算机系统中的角色。以下是对这两个概念的详细解析,以及它们之间差异的比较
    的头像 发表于 09-04 11:45 1931次阅读

    如何自定义内存控制器的设置

    策略都有其特定的使用场景和优缺点。以下是一些步骤和建议,用于自定义内存控制器的设置: 1. 选择合适的内存分配策略 heap_1 :最简单的内存分配策略,但分配的内存不允许释放。适用于
    的头像 发表于 09-02 14:28 600次阅读

    单片机中的几种环形缓冲区的分析和实现

    问题,而且其能够更高效的使用内存。在单片机中,由于内存有限,而且需要尽可能避免使用动态内存,所以环形缓冲区在单片机中应用非常广泛。二、原理通常我们需要使用一个数组
    的头像 发表于 08-14 08:39 1153次阅读
    单片机中的几种环形缓冲区的分析和实现

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

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

    电池模组需要置吗?为什么?

    电池模组在生产过程中确实需要进行置处理,这一步骤对于电池的性能和安全性至关重要。
    的头像 发表于 04-12 16:47 1657次阅读

    探索推理时KV Cache的动态内存压缩方法

    DMC通过一个决策变量(α)来有效地对输入序列进行分段,每个段落可以独立地决定是继续追加还是进行累积。这允许模型在不同段落之间动态调整内存使用。
    发表于 03-22 09:16 1007次阅读
    探索推理时KV Cache的<b class='flag-5'>动态内存</b>压缩方法

    C语言的指针用法

    C语言编程中善用指针可以简化一些任务的处理,而对于一些任务(比如动态内存分配),必须要有指针才行的。也就是说精通C指针编程是很有必要的,帮助你成为一名优秀的Cer。
    发表于 03-05 14:22 401次阅读
    C语言的指针用法

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

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

    单片机上用malloc()是个坑,有隐患?

    做单片机研发前几年,一直没用过动态内存分配的功能,但是如果想成为软件架构设计师,这是绕不过的一道坎。
    的头像 发表于 02-22 15:53 2595次阅读
    单片机上用malloc()是个坑,有隐患?