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

    文章

    23

    浏览量

    7917
  • 静态内存
    +关注

    关注

    0

    文章

    5

    浏览量

    1351

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

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

收藏 人收藏

    评论

    相关推荐

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

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

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

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

    FreeRTOS内存机制详解

    FreeRTOS是一种实时操作系统,它提供了多种内存分配方式,包括动态内存分配和静态内存分配。
    的头像 发表于 12-31 16:49 1101次阅读
    FreeRTOS<b class='flag-5'>内存</b>机制详解

    glibc的内存分配回收策略

    从上到下依次为stack栈(向下增长)、mmap(匿名文件映射区)、Heap堆(向上增长)、bss数据段、数据段、只读代码段。 其中,Heap区是程序的动态内存区,同时也是C++内存泄漏的温床
    的头像 发表于 11-13 11:16 346次阅读
    glibc的<b class='flag-5'>内存</b>分配回收策略

    DMA开辟缓存怎么使用动态内存

    开辟20kb左右的缓存空间,如果直接用全局变量数组,在不需要用到DMA时,那这20k的内存就一直不能释放,好浪费。若使用malloc来开辟动态内存,应该是放在堆区吧?堆区不是默认只有512字节?还要修改启动文件的堆大小?
    发表于 10-23 06:53

    51单片机能实现动态内存管理吗?

    怎么用51单片机实现动态内存管理
    发表于 10-15 12:43

    嵌入式系统动态内存的使用技巧

    一种比较好的方法是建立日志块,即每次分配内存时记录该内存块的指针和大小,释放时再去除该日志块,如果有内存泄露就会有对应的日志块记录这些内存
    发表于 10-12 15:22 139次阅读

    RT-Thread使用经验分享:动态申请的内存未清零造成死机

    最近在开发调试基于RT-Thread 的程序时,遇到一个比较奇怪的死机问题,后来经过一步步排查,终于发现是动态内存申请的数据结构没有清零引发的死机。
    的头像 发表于 10-08 14:59 502次阅读
    RT-Thread使用经验分享:<b class='flag-5'>动态</b>申请的<b class='flag-5'>内存</b>未清零造成死机

    C语言程序设计中动态内存分配如何实现

    C语言程序设计中,动态内存分配如何实现,需要注意哪些问题?
    发表于 09-28 16:53 846次阅读

    安信可Ai-WB2系列二次开发如何定位分析代码里面的静态内存动态内存情况

    一.软硬件准备 二.编译工程 三.静态内存的获取 四.动态内存的获取 五.联系我们 01 软硬件准备 eclipse软件,bl_iot_sdk,Ai-WB2系列模组或者开发板,静态内存分析软件
    的头像 发表于 09-18 15:37 297次阅读
    安信可Ai-WB2系列二次开发如何定位分析代码里面的静态<b class='flag-5'>内存</b>和<b class='flag-5'>动态内存</b>情况

    如何正确使用动态内存

    预防: 编写代码时malloc()和free()保证成对出现,避免忘记资源回收。
    发表于 09-15 09:21 284次阅读

    FreeRTOS内存管理简介

    ,比如任务创建函数 xTaskCreateStatic(),使用此函数创建任务的时候需要由用户定义任务堆栈,我们不讨论这种静态方法。 使用动态内存管理的时候 FreeRTOS 内核在创建任务、队列、信号量的时候会动态的申请 RAM。标准 C 库中的 malloc()和 f
    的头像 发表于 07-30 10:26 406次阅读

    使用C语言实现简单动态内存分配

    首先要明白为何需要动态内存分配,熟悉C语言的读者应该对这个比较熟悉,需要一段内存时会使用malloc函数来申请所需要大小的内存,函数返回一段内存
    发表于 07-28 16:26 389次阅读
    使用C语言实现简单<b class='flag-5'>动态内存</b>分配

    类和动态内存分配(二)

    若要将单个值转换为类类型,则需要创建对应的类构造函数
    的头像 发表于 07-18 10:47 235次阅读

    类和动态内存分配(一)

    如果将成员函数声明为静态的(函数声明必须包含关键字static,但如果函数定义是独立的,则其中不能包含关键字static),则不能通过对象调用静态成员函数,且由于静态成员函数不能与特定的对象相关联,因此静态成员函数只能使用静态数据成员。
    的头像 发表于 07-18 10:45 184次阅读