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

    文章

    25

    浏览量

    8218
  • 静态内存
    +关注

    关注

    0

    文章

    6

    浏览量

    1529

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    为什么单片机中很少使用malloc,而PC程序频繁使用呢?

    使用 malloc)变得不太适用,因为动态内存分配可能导致内存碎片,造成内存不足或系统崩溃。 PC:现代PC的内存资源相对丰富,RAM通常在GB级别。在这种环境下,malloc 可以灵
    发表于 11-20 06:55

    STM32H7使用Serial V2框架配合DMA,可以修改DMA的buffer内存位置吗?

    因为主内存设置在了dtcm,不能被dma访问,然而serial v2框架开启dma,缓存使用的是动态分配的内存,要如何修改buffer位置呢
    发表于 10-09 07:04

    求助,关于cubemx + nano 4.1.1 + STM32F405时钟的问题求解

    动态内存打开 然后发现打印延迟正常了,就是一秒钟打印一次,这也能影响到?是bug还是没适配好,但是shell还是不能用
    发表于 09-16 06:05

    400Hz中频变电源简单介绍

    400Hz中频变电源,作为现代电力电子技术的杰出代表,以其卓越的性能和广泛的应用领域,在航空、航天、军事通信、精密测试等多个高端科技领域扮演着不可或缺的角色。本文将详细介绍HJ61/63系列
    的头像 发表于 08-04 16:57 1168次阅读
    400Hz中频<b class='flag-5'>静</b>变电源简单介绍

    揭秘LuatOS:实时操作系统RTOS核心库的关键技术剖析!

    为满足实时控制场景的严苛需求,LuatOS核心库采用抢占式调度策略,确保高优先级任务即时响应。通过静态内存分配和零拷贝通信机制,系统不仅避免了动态内存碎片问题,还大幅提升了任务间数据交换效率,适用于
    的头像 发表于 05-21 16:02 523次阅读
    揭秘LuatOS:实时操作系统RTOS核心库的关键技术剖析!

    HarmonyOS优化应用内存占用问题性能优化一

    一、 概述 用户功能的不断增强,应用越来越复杂,占用的内存也在不断膨胀,而内存作为系统的稀缺资源比较有限,当应用程序占用过多内存时,系统可能会频繁进行
    发表于 05-21 11:27

    IEC61508系统中的动态内存使用

    IEC 61508标准强烈推荐使用静态内存管理方式。在安全应用设计中,我们都在遵循这个建议。
    的头像 发表于 04-11 15:17 1208次阅读
    IEC61508系统中的<b class='flag-5'>动态内存</b>使用

    如何使用LAX_CODEGEN启用动态内存分配?

    我目前正在探索NXP_MBDToolbox_LAX。lax_codegen 生成的代码基于静态分配。我想管理大型向量,如何使用 LAX_CODEGEN 启用动态内存分配?
    发表于 04-10 08:09

    反激的PSR与SSR控制技术解析及优劣

    方面,SSR控制由于PSR控制,每种控制技术都有各自的优劣。根据CV控制策略,PSR控制可分为四代,即:Gen1为单一的PFM模式;Gen2为分段PFM模式;Gen3为PFM+PWM混合模式,在动态
    发表于 03-27 13:51

    LLC动态性能分析

    这里的LLC动态是指LLC电路在突加负载时的动态响应。一般用输出电压的下跌和过冲评判LLC动态性能。
    的头像 发表于 03-19 09:45 1865次阅读
    LLC<b class='flag-5'>动态</b>性能分析

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

    动态分配的数据等内容。(内存分区图示)理解这些内存分区的结构和特性,不仅有助于编写更高效的代码,还能帮助排查和解决如段错误、内存泄漏、栈溢出等常见问题。以下是常见的六
    的头像 发表于 03-14 17:37 1346次阅读
    快速搞懂C语言程序<b class='flag-5'>内存</b>分区!

    stm32F407平台上使用freertos,使用pvPortMalloc申请内存,发现内存中的数据总被修改,怎么解决?

    如题,我现在在stm32F407平台上打开FREERTOS,然后使用pvPortMalloc动态申请内存的时候,发现这块内存中的数据总是变化,后面改为malloc申请,内存中的数据就符
    发表于 03-07 09:03

    hyper 内存,Hyper内存:如何监控与优化hyper-v虚拟机的内存使用

    在日常工作中,我们常常需要处理大量的文件和数据,这些重复性任务不仅耗时耗力,还容易因疲劳而导致错误。幸运的是,批量管理工具的出现为这一问题提供了高效的解决方案。今天就为大家介绍Hyper内存
    的头像 发表于 01-24 14:15 1693次阅读
    hyper <b class='flag-5'>内存</b>,Hyper<b class='flag-5'>内存</b>:如何监控与优化hyper-v虚拟机的<b class='flag-5'>内存</b>使用

    一文洞悉PoC公网对讲与DMR数模对讲的优劣之势

    在通信领域,对讲技术以其独特的即时通讯特性,在众多行业和场景中发挥着重要作用。其中,PoC公网对讲和DMR数模对讲作为两种主流的对讲技术,各自具有独特的优势和局限性。本文将对这两种技术进行详细的比较
    的头像 发表于 12-25 16:24 1320次阅读
    一文洞悉PoC公网对讲与DMR数模对讲的<b class='flag-5'>优劣</b>之势

    Redis缓存与Memcached的比较

    Redis和Memcached都是广泛使用的内存数据存储系统,它们主要用于提高应用程序的性能,通过减少对数据库的直接访问来加速数据检索。以下是对Redis和Memcached的比较,涵盖了它们的一些
    的头像 发表于 12-18 09:33 925次阅读