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

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

3天内不再提示

嵌入式软件开发的动态内存分配解决问题

星星科技指导员 来源:嵌入式计算设计 作者:Colin Walls 2022-06-30 14:36 次阅读

越来越多的嵌入式软件开发人员意识到动态内存分配——在需要时获取大块内存并在以后放弃它们——虽然方便灵活,但也充满了问题。这些问题不仅限于嵌入式代码,许多桌面应用程序都存在影响性能和可靠性的内存泄漏。但在这里我想专注于嵌入式。

质疑使用标准malloc()库函数的三个关键原因:

内存分配可能会失败。这可能是因为没有足够的可用内存(在堆中)来满足请求。也可能是碎片造成的;有足够的可用内存,但没有连续的块足够大。

该函数通常是不可重入的。在多线程(多任务)系统中,如果函数被多个任务调用,则它们必须是可重入的。这确保了,如果调用被中断,对该函数的另一次调用不会危及第一次调用。

它不是确定性的。在实时系统中,可预测性(确定性)至关重要。标准malloc()函数的执行时间非常多变且无法预测。

pYYBAGK9RKuAQrwQAAB-d-GRdEM349.png

这些都是有效的点,并且有解决它们的方法,这通常是使用实时操作系统 (RTOS) 提供的功能的问题。

然而,尽管它们是有效的,但问题可能并不总是像看起来那么重要:

如果发生分配失败,该函数将返回一个NULL指针。这很容易检查,并且可以采取行动。

在许多应用程序中,所有内存分配和释放都在单个任务中执行。这使得重入是不必要的。

并非所有嵌入式系统都是实时的,因此可能不需要确定性。

malloc()可能会带来另一个挑战:它相当慢。一些系统需要速度,而不是可预测性,因此需要考虑找到一种方法来提供此功能的功能并具有更高的性能。

该函数性能不佳的主要原因是它提供了很多功能。不同大小的内存块的管理是相当复杂的。对于许多应用程序来说,这实际上是多余的,因为所需的内存分配都是相同的大小(或少量不同的已知大小)。为固定大小的块编写内存分配器非常简单;只是一个带有使用标志的数组或者一个链表。代码肯定会更快,甚至可以确定地完成。分配失败仍然可能发生,但管理起来很简单。这种类型的内存分配通常由流行的 RTOS 产品提供。

审核编辑:郭婷

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

    关注

    4981

    文章

    18281

    浏览量

    288387
  • RTOS
    +关注

    关注

    20

    文章

    776

    浏览量

    118789
收藏 人收藏

    评论

    相关推荐

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

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

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

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

    嵌入式软件开发应该掌握哪些知识?

    的控制,如GPIO、串口、SPI、I2C 等。这使得嵌入式软件开发人员能够充分利用硬件资源,满足特定的需求。 1.2数据结构与算法 嵌入式系统通常具有有限的内存资源。通过使用合适的数据
    发表于 02-19 11:23

    嵌入式软件开发软件开发的区别

    嵌入式软件开发软件开发是两个不同的概念,它们在一些关键方面有着明显的区别。嵌入式软件开发是指开发
    的头像 发表于 01-22 15:27 588次阅读

    嵌入式硬件和软件哪个好?

    这类技术都是看经验的,经验越高,那他的身价也相应变高。据统计,65%的电子产品开发企业中,嵌入式软件开发工程师团队,往往只占全公司人数的5%,但是却创造了全公司超过70%的效益。 嵌入式
    发表于 12-05 15:17

    嵌入式软件开发流程

    电子发烧友网站提供《嵌入式软件开发流程.ppt》资料免费下载
    发表于 11-17 14:37 1次下载
    <b class='flag-5'>嵌入式</b><b class='flag-5'>软件开发</b>流程

    嵌入式软件的问题分析

    嵌入式软件的问题分析 1 问题背景一切为了进度,软件开发的首要目标就是以最快的速度满足客户需求,“快”是第一要素,但是短期指标;可复用性、扩展性等长期指标被忽略,导致后期的维护、功能增减调整都非常
    发表于 11-17 09:29

    嵌入式软件开发常用工具有哪些?

    分享一些嵌入式软件开发常用工具。 1、Keil MDK:这是德国Keil公司开发的基于8051、9051、ARM7、ARM9系列微控制器的嵌入式
    发表于 11-10 11:03

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

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

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

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

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

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

    嵌入式Linux应用开发的完全手册

    论坛疯狂发帖求教,现在回头一看不免感叹:怎么会提出这么弱智的问题?但是,当时就是被这类问题折磨得寝食难安。 相对于嵌入式Linux常识的匮乏,更大的困难是缺乏完善的知识结构:只了解硬件,或是只了解软件
    发表于 09-25 07:12

    嵌入式软件好还是硬件好?

    越高,那他的身价也相应变高。据统计,65%的电子产品开发企业中,嵌入式软件开发工程师团队,往往只占全公司人数的5%,但是却创造了全公司超过70%的效益。 嵌入式
    发表于 09-18 15:31

    107使用ADS v1.2进行嵌入式软件开发

    当开始为嵌入式应用程序开发软件时,ADS的用户可能不知道他们的目标硬件的技术规格。目标外围设备、内存映射甚至处理器本身的细节可能是未知或未确定的。 为了在知道或考虑此类细节之前进行软件开发
    发表于 08-30 06:27

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

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