返回首页  设为首页  加入收藏  今天是:
网站首页电脑主板电脑cpu电脑内存电脑硬盘电脑显卡电脑电源显示器电脑配件电脑维修
相关文章
 浅谈 malloc 函数在单片机上…
 GD32开发实战指南(基础篇) 第…
 中国台湾电脑显示器出货今年…
 惊艳色彩表现 丰富接口配置 …
 4k显示器的基本配置
 Win8系统电脑自动关闭显示屏…
 攀升电脑多规格27英寸显示器…
 芯片散热难题获重大突破天和…
 电脑温度过高教您几招降温
 【秒懂知识库】一文看懂如何…
 电脑突然死机是什么原因
 改善CPU占用率高的一些方法(…
 街机配置下车了ARGB风扇接线…
 小白装机完成有几个问题请教…
 CSGO电脑最低配置要求是什么…
 第一次diy没想到困难重重 请…
 csgo饰品交易平台叫什么?CS…
 内存的新战争:韩国人还能赢…
 iPhone14和14pro的区别是什么…
 qq怎么清理隐藏内存
 内存存储销量公布线K销量冠军…
 如何挑选合适内存 内存选购技…
 RTX 4080显卡功耗是多少 显存…
 RTX4070ti显卡什么水平 是几…
 30万显卡打游戏表现不如核显…
 RTX 4050显卡玩游戏够吗?_R…
 买显卡小心被这三种话术骗了
 阳光电源品牌价值突破800亿元
 安钛克 Antec NE1300W 金牌全…
 如何正确选择伺服电机和步进…
 实达科技 产品全球畅销领跑汽…
 开关电源14种拓扑计算公式大…
 扣押小米 48 亿后印度提出新…
 抖音赚钱博主的十大类型
 12代I7超值!华硕破晓2:告别…
 华硕n系列笔记本怎么样 华硕…
 笔记本电脑品牌标志有哪些 笔…
 机械硬盘消亡在即!不只是因…
 电脑为什么越来越卡?原因全…
 Dynabook推出Portégé X30L…
 苹果Mac Pro掉硬盘
 通电3年就弹警告西数为促使用…
 笔记本电脑是否可以安全回收…
 玄龙骑士G9:电竞显示器“超…
 身临其境!3D显示器原理揭秘
 小米(MI) Redmi238英寸电竞…
 A股机构动向参考|地产全面爆…
 苹果被猛击一拳:头显之战苹…
 3499 元到手:R7-5825U 处理…
 攀升暴风龙P3护眼版笔记本电…
专题栏目
网络
您现在的位置: 电脑评测网 >> 电脑内存 >> 正文
高级搜索
浅谈 malloc 函数在单片机上的应用
作者:佚名 文章来源:本站原创 点击数: 更新时间:2023/6/21 21:33:39 | 【字体:

  江苏省高考分数专栏,当初写到了内存管理的时候,想了想该怎么来说明这个内存管理,实际上在平时使用

  但是每个都会有自己的内存管理方式,本文就来聊聊我对 malloc 函数在单片机程序设计中的一些看法。

  本文并不是要说明在单片机中怎么使用 malloc函数,而是根据博主自己的理解,从函数使用的根本上来分析需不需要使用,何时何地使用。

  对于malloc函数,应该所有嵌入式工程师都知道,即便没用过也都听过,通过上面简单的说明,也都能够知道是干什么用的。

  注意上面红色框框部分,malloc开辟的是连续的空间,返回的是一个地址,当内存不使用,需要使用free()函数释放内存。

  在我们的单片机程序设计中,大都使用的C语言,当然可以使用 malloc 函数,但是有很多人并不能够真正的理解它。

  要理解单片机系统中的 malloc函数 ,首先必须了解动态分配的内存是在什么地方呢!

  要了解这个问题,就得了解内核的数据存储方式,我们以常用的STM32为例,我也写过文章,带大家学习STM32的内存管理(也马上回在发烧友发表,带给大家)。

  这里我可以通过截图给大家简单说明,了解下单片机的堆栈,在文中有如下说明:

  如果通过上面推荐的博文理解了内存分配,那么我们就可以得到如下结论,可以知道 malloc 申请空间的准确地址了:

  知道了malloc申请空间在单片机中的地址,我们再来看一下用于不用的区别。

  一般在我们的设计中,函数中可能会初始化一些临时变量,如果是一个数组,那么他也会申请一段内存空间,我们通过一张图来看看使用临时变量与malloc 的区别:

  解释到这里,相信大家对在单片机上使用 malloc 有了一个更深的认识。他所存放的空间与我们经常局部变量的空间是不同,而且我们也知道了在什么位置。

  至于单片机用还是不用 malloc函数? 别急,我们还得往下面分析分析。

  注意图中画红色的部分,简单解释就是,使用 malloc 函数多了以后,会产生很多的内存碎片,白白浪费内存。

  这种专业的术语还得靠万能的百度(虽然百度百科的解释针对的是大范围的,但是对于单片机来说其实是一样的):

  在上图中其实有碎片是如何产生的说明,内部碎片是因为处理器的体系结构,需要字节对齐,比如我们在单片机中,常有4字节对齐,8字节对齐,不要说这个也不知道,我随便打开一个 STM32L051 的启动文件说明(GCC环境下的链接文件):

  按照这个启动文件,我们也应该能知道,堆栈内存空间是需要8字节对齐的,那么我们在STM32上使用 malloc 分配的内存空间是8字节对齐的,即便你用不上8个字节,系统也会给你对齐补上。

  随着内存不断被分配和释放,整个内存区域会产生越来越多的碎片,因为在使用过程中,申请了一些内存,其中一些释放了,导致内存空间中存在一些小的内存块,它们地址不连续,不能够作为一整块的大内存分配出去,系统中还有足够的空闲内存,但因为它们地址并非连续,不能组成一块连续的完整内存块,会使得程序不能申请到大的内存。

  在我们使用的单片机上,碎片产生问题尤为明显,平时接触不到,那是因为一般学习测试不会遇到复杂的项目。

  内存管理就是为了解决上面提到的内存碎片问题,如何高效,快速的分配,并且在适当的时候释放和回收内存资源。

  如果使用嵌入式操作系统比如FreeRTOS、RT-Thread 的话,他们内核是自带内存管理的,本文并不会讨论他们具体是如何内存管理的,但是有必要了解一下操作系统的思路。

  操作系统首先向系统申请了一块大的内存,这块内存内存由操作系统自己的内存管理方式,对于FreeRTOS而言有5种内存管理方式:

  对于申请的这块内存由操作系统自动管理,FreeRTOS操作系统创建的任务,任务栈使用的就是这一块内存,同时使用pvPortMalloc函数申请动态内存,也会从这一块内存中分配,因为他有一套完善的内存管理方式,所以相对我们直接使用malloc来说,他能够很好的处理系统内存碎片的问题。

  既然说到这里,额外的一个问题,就是 FreeRTOSconfigTOTAL_HEAP_SIZE定义额这块内存处于单片机内存那个部分呢?

  对于单片机使用的嵌入式操作系统来说,他们有自己的内存管理方式,也会提供对于的动态内存申请结构,这时候我们使用操作系统提供的 malloc接口函数,可以很好的避免内存碎片的产生。

  注意!!单片机用了有内存管理的操作系统,系统会提供对于的 API,比如 FreeRTOS 的pvPortMalloc函数,RT-Thread 的rt_malloc函数。如果使用 C 库的malloc,还是会从系统堆里面申请内存!!

  对于高端的单片机,有 MMU(内存管理单元) 模块,比如 Cortex-A 系列,有了MMU就能跑linux,那么内存管理也是必备。

  本文算是详细分析了一下 malloc 函数在单片机上的使用效果,我们知道了 malloc 函数使用申请了内存空间在哪里,我们也知道了内存碎片是如何产生的。

  如果跑裸机 做些小项目,如果没有自己的内存管理方式不是必要都不建议使用,同时为了节约内存,可以把heap设置成很小(留一点给可能调用的C库函数会用到)。

  如果跑操作系统,操作系统有完善的内存管理,可以痛快的使用操作系统的malloc接口函数。但是如果做些小项目,也是可以不用的。

  如果你选用的芯片内存比较小,10多K甚至几K,还是用静态内存局部变量把,因为能够使用小内存的项目也不会太复杂,比如单品项目。

  如果选用的芯片内存比较大上了 MB, 那么还是可以尝试使用 malloc 动态内存分配的,但是前提还是得有内存管理。

  但是最后还是得说一下,随着现在的单片机发展,内存越来越大,虽然单片机小项目不建议使用 malloc 函数,但是我们上了操作系统以后,要学会去使用动态内存分配,因为当以后做的项目越来越复杂,线程越来越多,我们定义的局部变量越来越多,即便我们可以继续增大系统 栈 的大小,但是这终究不是一种合理的解决方式。

  没有必要钻牛角尖,如果项目简单但就是想用。比如我就一个函数使用malloc 申请动态内存,没有内存管理,我就是用了怎么地? 这种情况用不用都一样,看自己高兴,没有必要纠结!

  :对于任何电子产品,硬件是软件运行的基础,而软件赋予了硬件灵魂,两者有机结合成为一个功能丰富、强大的系统。我们写的代码是如何在

  并不能像在PC上一样正常运行,这涉及到了内存池的概念。下面就来演示一下如何在

  使用,如STM32可以先在启动文件中设置heap的大小,再使用动态内存分配: Heap_Size EQU 0x00000200 \\也就

  使用,如STM32可以先在启动文件中设置heap的大小,再使用动态内存分配: Heap_Size EQU 0x00000200 \\也就

  的认识 /

  动态开辟内存的方式开辟了一段内存空间,然后进行写入数据修改数据的操作,但是下面的代码会导致

  产生内存泄露的问题及解决方法 /

  的编程框架和一般的开发流程,并给出范例程序。并较为浅显解释了Contiki的工作机制。如何使用Contiki开发程序?先给出main

  的编程框架 /

  的手册中,对于端口复位后的状态,是这样描述的:复位后,所有端口处于输入状态。 就这个问题,我们来简单说一下

电脑内存录入:admin    责任编辑:admin 
  • 上一个电脑内存:

  • 下一个电脑内存: 没有了
  •  
     栏目文章
    普通电脑内存 浅谈 malloc 函数在单片机上的应用 (06-21)
    普通电脑内存 GD32开发实战指南(基础篇) 第4章 GD32启动流程… (06-21)
    普通电脑内存 内存的新战争:韩国人还能赢多久? (06-21)
    普通电脑内存 iPhone14和14pro的区别是什么 是4G还是6G内存… (06-21)
    普通电脑内存 qq怎么清理隐藏内存 (06-21)
    普通电脑内存 内存存储销量公布线K销量冠军居然是光威 (06-21)
    普通电脑内存 如何挑选合适内存 内存选购技巧介绍【详解】 (06-21)
    普通电脑内存 电脑内存怎么选 电脑内存选购指南【详细介绍】 (06-20)
    普通电脑内存 电脑内存_全球百科 (06-20)
    普通电脑内存 电脑的内存指哪个(电脑内存一般是指什么) (06-20)
    普通电脑内存 电脑48g内存只有24g可用(电脑48g内存比32g快… (06-20)
    普通电脑内存 手机总是容易满内存到底是什么在占用着内存? (06-20)
    普通电脑内存 公认最好的CSGO开箱网站是指什么? CSGO电脑最… (06-20)
    普通电脑内存 世界时讯:最多玩家用的csgo网站开箱子是什么… (06-20)
    普通电脑内存 DDR5高速内存在京东618迎来黄金发展期 成交额… (06-20)
    普通电脑内存 内存条品牌内存条和固态硬盘区别 (06-20)
    普通电脑内存 将用户体验拉向新高度 京东618 DDR5高速内存成… (06-20)
    普通电脑内存 各位马自达CX-4请问这张内存卡是用来干嘛的 (06-19)
    普通电脑内存 兄弟们可以帮我看看是cpu主板或者电源的问题吗 (06-19)
    普通电脑内存 深科技的HBM技术和光通讯布局 (06-19)