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

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

3天内不再提示

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

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

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

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

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

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

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

pYYBAGK9RKuAQrwQAAB-d-GRdEM349.png

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

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

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

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

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

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

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

审核编辑:郭婷

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

    关注

    5087

    文章

    19148

    浏览量

    306177
  • RTOS
    +关注

    关注

    22

    文章

    817

    浏览量

    119724
收藏 人收藏

    评论

    相关推荐

    嵌入式系统开发与硬件的关系 嵌入式系统开发常见问题解决

    系统开发与硬件关系的几个关键点: 硬件依赖性 :嵌入式系统的软件必须能够在特定的硬件上运行,这包括处理器、内存、输入/输出接口等。软件必须能
    的头像 发表于 12-09 09:38 327次阅读

    一文了解嵌入式软件开发的对象

    以前应用场景很单一,嵌入式开发可能谈不上面向对象开发。但现在,做嵌入式开发,没有面向对象开发,你就有点落伍了。 本文结合个人经验和周立功《抽象接口技术和组件
    的头像 发表于 11-15 10:31 382次阅读
    一文了解<b class='flag-5'>嵌入式</b><b class='flag-5'>软件开发</b>的对象

    你认为嵌入式软件开发的尽头是什么?

    嵌入式软件开发的“尽头”是一个富有哲理且多维度的概念,因为它不仅关乎技术发展的极限,还涉及到行业应用、市场需求、技术融合与创新等多个方面。从几个不同的视角来看
    的头像 发表于 09-18 09:42 478次阅读
    你认为<b class='flag-5'>嵌入式</b><b class='flag-5'>软件开发</b>的尽头是什么?

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

    嵌入式开发常用软件有哪些? 对于初学嵌入式的朋友们,会想要了解嵌入式软件开发常用的软件有些,有什
    发表于 09-09 15:22

    节点、跨平台开发,AWFlow让嵌入式开发变得更简单

    国产化趋势对嵌入式软件开发构成挑战,导致软件移植和适配需求激增,影响开发效率。AWFlow软件通过节点化和跨平台
    的头像 发表于 08-02 08:25 387次阅读
    节点<b class='flag-5'>式</b>、跨平台<b class='flag-5'>开发</b>,AWFlow让<b class='flag-5'>嵌入式开发</b>变得更简单

    嵌入式软件开发与AI整合

    嵌入式软件开发与AI整合是当前技术发展的重要趋势之一。随着人工智能技术的快速发展,嵌入式系统越来越多地集成了AI算法,以实现更复杂的智能功能。以下是关于嵌入式
    的头像 发表于 07-31 09:25 741次阅读
    <b class='flag-5'>嵌入式</b><b class='flag-5'>软件开发</b>与AI整合

    嵌入式软件开发招聘

    本帖最后由 jf_19082533 于 2024-7-26 13:56 编辑 寻求:嵌入式软件工程师 要求:3年以上开发经验,音视频领域应用层开发 地址:北京市昌平区 邮箱:10
    发表于 07-26 13:44

    嵌入式开发者的未来

    和测试这些产品的硬件和软件。汽车行业:现代汽车包含大量的嵌入式系统,例如车载娱乐系统、发动机控制单元、自动驾驶系统等。在这个领域,工程师可以从事嵌入式软件开发、系统集
    的头像 发表于 06-23 08:10 391次阅读
    <b class='flag-5'>嵌入式开发</b>者的未来

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

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

    AMD Vitis™ Embedded嵌入式软件开发套件的功能和特性概述

    Vitis Embedded 是一款独立的嵌入式软件开发套件,主要用于为 AMD 自适应 SoC 和 FPGA 中的 AMD 嵌入式处理子系统(基于 ARM 的子系统和 AMD MicroBlaze)
    的头像 发表于 04-08 10:50 946次阅读
    AMD Vitis™ Embedded<b class='flag-5'>嵌入式</b><b class='flag-5'>软件开发</b>套件的功能和特性概述

    嵌入式软件设计的原则分享

    嵌入式软件开发如果具有更好的阅读性、扩展性以及维护性,就需要考虑很多因素。今天给大家分享几个嵌入式软件设计的原则。
    发表于 02-25 10:54 715次阅读
    <b class='flag-5'>嵌入式</b><b class='flag-5'>软件</b>设计的原则分享

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

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

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

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

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

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

    聊一聊嵌入式C语言

    作为一名嵌入式软件开发者,熟练掌握嵌入式C语言对我的日常工作至关重要。
    的头像 发表于 01-22 09:28 558次阅读