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

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

3天内不再提示

为什么单片机上的程序不怎么使用malloc?

Q4MP_gh_c472c21 来源:嵌入式ARM 作者:嵌入式ARM 2022-03-31 13:56 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

我们都知道,单片机在上电的那一刻,MCU的程序指针会被初始化为上电复位时的地址,从那个地址处读取将要执行的指令,由此程序在MCU上开始执行。当然,在调用程序的main之前,还有一系列其他的初始化要做,比如堆栈的初始化,不过这些我们很少会去修改。

PC在上电时,其实和MCU差不多,不过读取的是BIOS,有它完成了很多初始化操作;最后,调用系统的初始化函数,将控制权交给了操作系统。于是,我们就看到了Windows,Linux系统启动了。

如果将操作系统看作是在处理器上跑的一个很大的裸机程序(就是直接在硬件上跑的程序,因为操作系统就是直接跑在CPU上的,这样看待是可以的,不过这个裸机程序功能很多很强大),那么操作系统的启动很像MCU程序的启动。前者有一个很大的初始化程序完成很复杂的初始化;后者有一段不长的汇编代码完成一些简单的初始化。从这一点看,它们在流程上是很相似的。

那么,如果是系统上的程序启动呢?

它们是由系统来决定的。Linux上在shell下输入。/p后,首先检查是否是一个内建的shell命令;如果不是,则shell假设它是一个可执行文件(Linux上一般是elf格式),然后调用一些相关的函数,将在硬盘上的p文件的内容拷贝到内存(DDR RAM)中,并建立一个它的运行环境(当然,这里还有内存映射、虚拟内存、连接与加载等一些其它东西),准备执行。

由以上可知,单片机上的程序和平时在系统上运行的程序,在启动时差异是很大的(如果将程序调用main以前的动作,都抽象为初始化的话,程序的启动可以简化为:建立运行环境+调用main函数,这样程序的执行差异是不大的)。因为单片机上跑的程序(裸机程序)是和操作系统一样跑在硬件上的,它们属于一个层次的。过去之所以没有区分出单片机上的程序和PC机上的程序的一些差异,就是没有弄明白这一点。由此,以前的一些疑惑也就解开了。

为什么单片机上的程序不怎么使用malloc,而PC上经常使用?

因为单片机上没有已经写好的内存管理算法的代码;而在PC上操作系统里运行的程序,libc已经把这些都做了,只需要调用就可以了。

如果在单片机上想用动态内存也可以,但这些代码要自己去实现,并定义一个相应的malloc。有时候一些公司会给提供一些库函数可能会实现malloc,但因为单片机上RAM内存十分有限,如果不知道它的运行方式,估计会很危险。同样,因为在PC的系统上运行的程序与裸机程序不同,裸机程序不会有动态链接,有的只是静态链接。

至于程序在执行时,从哪里读取指令,哪里读取数据,也曾因为没有弄清楚系统上的程序和裸机程序之间的区别,而疑惑了很久。虽然在《微型计算机原理》课上知道程序运行时,从内存中读取指令和数据进行执行和回写。但是,单片机上只有几K的RAM,而Flash一般有几十K甚至1M,这个时候指令和数据都在内存中吗(这里的内存仅指RAM,因为PC上我们常说的内存就是DDR RAM memory,先入为主,以至于认为单片机上也是这样,还没有明白其实RAM和Flash都是内存)?

这不可能,因为课上老师只说内存,但PC上内存一般就是DDR RAM,不会是硬盘,因为硬盘是保存数据的地方。由此类比时,自己把自己弄晕菜了,单片机的RAM对应于DDR RAM,那么Flash是不是就对应于硬盘了呢?

在CSAPP上明白了,PC上之所以都在DDR RAM上,是速度的因素。硬盘的速度太慢,即使是即将到来的SSD比起DDRRAM,还是差着几个数量级,所以拷贝到DDRRAM中。这时,一个程序的代码和数据是连续存放的,其中代码段是只读区域,数据段是可读写区域(这是由操作系统的内存管理机制决定的)。运行时,再将它们拷贝到速度更快的SRAM中,以得到更快的执行速度。

而对于单片机而言,工作频率也就几M、几十M,从Flash中与从RAM中读的差异可能并不明显,不会成为程序执行的瓶颈(而对于PC而言,Flash的速度太慢,DDR RAM的速度也是很慢,即使是SRAM也是慢了不少,于是再提高工作频率也提高不了程序的执行速度,所以一个瓶颈出现了。为了提高CPU的使用率,换个角度想一下,既然不能减少一段程序的执行时间,就在同样的时间执行更多的程序,一个核执行一段程序,两个核就可以执行两段程序,于是多核CPU成为了现在的主流)。

所以,裸机程序指令就在Flash(Flash memory)中存放,而数据就放在了RAM中(Flash的写入次数有限制,同时它的速度和RAM还是差很多)。更广泛地说,在单片机上RAM存放data段、bss段、堆栈段;ROM(EPROM、EEPROM、Flash等非易失性存储设备)存放代码、只读数据段。

本质上说,这和PC上程序都在RAM中存放是一样的。PC上是操作系统规定了可读与可写;而单片机上是依靠不同的存储设备区分了可读与可写。当然,现在的Flash是可读写的,如果Flash没有写入次数限制,速度又可以和RAM相差不多,单片机上是不是只要Flash就可以了呢(直接相当于PC上的DDRRAM)?这样成本也会比一个RAM、一个Flash低,更节省成本,对于生产商更划算。

对于单片机程序执行时指令和数据的存放与读取,理解如下:

单片机编程后,程序的代码段、data段、bss段、rodata段等都存放在Flash中。当单片机上电后,初始化汇编代码将data段、bss段复制到RAM中,并建立好堆栈,开始调用程序的main函数。以后,便有了程序存储器和数据存储器之分,运行时从Flash(即指令存储器,代码存储器)中读取指令 ,从RAM中读取与写入数据,RAM存在的意义就在于速度更快。

无论是单片机,还是PC,存在的存储器金字塔都是一致的。速度的因素、成本的限制,导致了一级级更快的存储器的更快速度与更高的成本。应该说,对于程序执行的理解,就是存储器金字塔的理解。

那么,什么是RAM、ROM和Flash呢?

尽管他们都是计算机内存的一种形式,但RAM、ROM、FLASH它们三个都以各自的方式和他们存储的数据进行交互。

下面,将对每种内存有一个简短的说明。

RAM:表示随机访问内存(random access memory):微处理器可以读写访问的内存。当我们创建一些东西时,它是在内存中完成的。RAM是内存,反之亦然。

ROM:表示只读内存:微处理器可以读ROM,但是不能写入或修改。ROM是永久性的。ROM芯片经常保存一些重要且永不改变的特殊计算机指令。无论何时,微处理器都可以访问到存储在ROM上的信息。因为这些指令不可被擦出,所以他们保存在ROM中。

Flash Memory:是一种兼具RAM和ROM二者性质的特殊内存。我们可以像操作RAM一样,向Flash 内存写入数据;但是它又像ROM一样,数据在掉电时不丢失。悲剧的是,Flash 内存没有RAM那么快,所以任何时候都不要指望它能取代标准的计算机内存。

审核编辑 :李倩

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

    关注

    68

    文章

    20148

    浏览量

    247081
  • 单片机
    +关注

    关注

    6074

    文章

    45340

    浏览量

    663453
  • 操作系统
    +关注

    关注

    37

    文章

    7328

    浏览量

    128623
  • malloc
    +关注

    关注

    0

    文章

    53

    浏览量

    345

原文标题:为什么单片机上的程序不怎么使用malloc,而PC上经常使用?

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    单片机程序的执行

    memory)中存放,而数据就放在了RAM中(flash的写入次数有限制,同时它的速度和RAM还是差很多)。更广泛说,在单片机上RAM存放data段,bss段,堆栈段; 本质上说,这和PC上程序都在RAM中
    发表于 12-04 06:20

    为什么单片机还在用C语言编程?

    的缺陷 高级语言存在的目的是可以实现更为优化的算法,更多的是为了方便的执行方案,但是,高级语言对程序存储空间的占用要比汇编和C语言多很多。由于这个原因就决定了其他高级语言不适用在单片机上单片机
    发表于 11-28 07:37

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

    使用动态内存分配的情况下,系统依然能够保持一定的响应时间。 内存碎片问题单片机:动态内存分配(malloc)的最大问题之一是内存碎片,尤其是在内存紧张的情况下。单片机的内存管理器一般不如PC上的复杂和健壮
    发表于 11-20 06:55

    单片机烧录原理是怎样的?辉芒微单片机烧录程序详细步骤讲解

    烧录(Programming)就是把 .hex/.bin 文件里的机器码搬运进单片机片内 Flash 的过程。辉芒微(FMD)单片机内部有一块 自举 BootROM,上电时会先跑这段程序;如果检测
    的头像 发表于 09-17 16:14 1382次阅读
    <b class='flag-5'>单片机</b>烧录原理是怎样的?辉芒微<b class='flag-5'>单片机</b>烧录<b class='flag-5'>程序</b>详细步骤讲解

    单片机的储存优点是什么

    单片机作为嵌入式系统的核心,其储存系统是实现数据存储与程序运行的关键部分。与独立存储芯片相比,单片机的储存单元在集成度、功耗、可靠性等方面具备独特优势,这些优点使其能适应从消费电子到工业控制的多样化
    的头像 发表于 07-31 10:09 490次阅读

    怎么测单片机系统频率

    单片机系统频率是指单片机工作时的时钟频率,它直接影响单片机的运行速度和处理能力,准确测量系统频率对单片机应用开发、程序调试和性能优化具有重要
    的头像 发表于 07-25 11:39 474次阅读

    单片机怎么烧程序

    单片机程序是将编写好的程序代码写入单片机内部存储单元,让单片机按照预设逻辑工作的过程,是单片机
    的头像 发表于 07-23 11:47 650次阅读

    STM32单片机片上数字滤波器操作文档 快速入门数字滤波器在单片机上的实现

    这个文档,是为了帮助大家快速入门数字滤波器在单片机上的实现。
    的头像 发表于 06-23 16:53 1327次阅读
    STM32<b class='flag-5'>单片机</b>片上数字滤波器操作文档 快速入门数字滤波器在<b class='flag-5'>单片机上</b>的实现

    STC单片机范例程序

    电子发烧友网站提供《STC单片机范例程序.zip》资料免费下载
    发表于 06-04 16:27 8次下载

    2.4寸TFT彩屏配套测试程序-51单片机

    如题,2.4寸TFT彩屏配套测试程序-51单片机
    发表于 06-04 16:26 0次下载

    51+单片机TCP-IP+协议栈ZLIP源码

    概述 单片机上网技术,是当前的一个热门技术。单片机上网技术中的一个重要部分是在单片上实现 TCP/IP 协议栈。现在可获得的 TCP/IP 源代码一般并不为 51 单片机设计,而 51
    发表于 04-22 15:11

    单片机方面的大佬吗?有几个单片机方面的问题需要请教一下

    如题,有单片机方面的内容需要请教一下 (先叠个甲)纯小白 我需要一个单片机控制模块,我现在的想法是:在一个单片机上,我要让他控制一个传感器和一个步进电机(运动系统,运动距离为13.5cm),同时
    发表于 03-29 18:35

    不停的malloc程序会异常吗

    malloc 放在死循环里面,会是什么样的现象? 比如这样的代码,每次使用 malloc 申请 1M 大小的内存,其他什么操作也不做。 理论上来说,堆内存是有限的,如果不停的申请,迟早内存会被
    的头像 发表于 01-14 09:17 841次阅读

    单片机Debug工具性能对比 单片机调试常用命令

    单片机(Microcontroller Unit, MCU)调试是嵌入式开发中的一个重要环节,它帮助开发者发现和修复代码中的错误,优化程序性能。不同的单片机和开发环境可能使用不同的调试工具和命令
    的头像 发表于 12-19 09:56 2161次阅读

    单片机Debug与仿真区别

    是指在软件或硬件开发过程中,通过特定的工具和技术来查找、诊断和修复错误的过程。在单片机开发中,Debug通常涉及到以下几个方面: 硬件调试 :检查单片机的硬件连接是否正确,包括电源、时钟、I/O接口等。 软件调试 :使用调试器(Debugger)来检查
    的头像 发表于 12-19 09:47 1402次阅读