详解嵌入式MCU运行时分配的stack和heap

news2024/12/26 16:22:52

目录

概述

1 认识stack和heap

1.1 栈区(stack)

1.2 堆区(heap)

2 stack和heap的区别

2.1 管理方式的不同

2.2 空间大小不同

2.3 产生碎片不同

2.4 增长方式不同

2.5 分配方式不同

2.6 分配效率不同

3 确定stack和heap空间


概述

本文主要讲述了嵌入式开发中的stack和heap的概念,还详细比较了它们之间的区别,以及在实际应该过程中注意的问题。

1 认识stack和heap

1.1 栈区(stack)

由编译器自动分配释放,存放函数的参数值、返回值、局部变量等。在程序运行的过程中实时的加载和释放。因此,局部变量的生存周期为申请到释放该段栈空间的过程

1.2 堆区(heap)

用于动态内存分配,堆在内存中位于BSS区和栈区之间。一般由程序员分配和释放。对于有内存管理的OS来说,OS会定期回收没有被释放且没有被使用的内存。

在 ANSI C 中可以用 malloc()和 free()两个函数动态地分配内存和释放内存。但是,在嵌入式实时操作系统中,多次这样做会把原来很大的一块连续内存区域,逐渐地分割成许多非常小而且彼此又不相邻的内存区域,也就是内存碎片。由于这些碎片的大量存在,使得程序到后来连非常小的内存也分配不到。 在 4.02 节的任务堆栈中, 我们讲到过用 malloc()函数来分配堆栈时, 曾经讨论过内存碎片的问题。 另外, 由于内存管理算法的原因, malloc()和 free()函数执行时间是不确定的。
 

分配单个堆空间

分配多个堆空间

2 stack和heap的区别

stack是由编译器在程序运行时分配空间区域,由操作系统维护。在C语言中,堆是由malloc()函数分配的内存区,该内存的释放是由free()函数来完成。

stack和heap的区别由如下几点:

2.1 管理方式的不同

stack在程序运行时,由操作系统自动管理,无需程序员手动操作。堆的操作必须有程序员手工操作,否则会出现内存泄漏的情况。

一个stack调用的范例:

2.2 空间大小不同

stack是一个向地址扩展的数据结构,是一块连续的内存区域。即栈顶的地址和栈的最大容量是由系统预先规定好的,当申请的空间超过栈的剩余空间时,将提示溢出,因此,能重栈获得空间大小。

heap是想高地址扩展的数据结构,是不连续的内存区域。系统使用链表来存储空闲的内存地址,而链表遍历方式是从低地址开始,到高地址结束。堆获取内存空间比较灵活。

2.3 产生碎片不同

对heap来说,需要频繁的使用malloc/free来申请或者释放内存,可能会造成内存空间的不连续,从而造成大量的碎片,使得程序运行的效率降低。而stack的空间在程序运行时已经被分配好了。所以,不会出现这样的情况。

2.4 增长方式不同

heap的增长方式是向上的,朝着内存地址增加的方向增长

stack的增长方式是向下的,即朝着内存地址减少的方向增长

2.5 分配方式不同

heap都是由malloc/free来申请或者释放内存。stack的申请和释放是由操作系统自动完成的。

stack的动态分配是由alloca()函数来完成的,但其释放是由操作系统自动完成的。

2.6 分配效率不同

stack是系统提供的数据结构,操作系统会在底层对其提供支持,分配专门的寄存器存放栈的地址,压栈和出栈都有专门的指令执行,堆是由C函数库提供的。堆的操作由一整套算法来寻找内存空间,所以,堆的分配效率和栈相比会低很多。

3 确定stack和heap空间

Step -1:  在初始化时,将栈空间全部初始化一个固定数据0x5a

step -2:  初始化完成后,程序可以正常使用堆栈,由于程序会忘栈中压入新的数据,这将覆盖原来的数据0x5a

step - 3: 程序在运行的过程中,堆栈中的数据会起起落落的变化,最终在程序运行完成时,会有一个最大的栈空间。这个最大的栈空间是程序所需要最大的栈空间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1647361.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

细数:智能物流装备界的并购案~

导语 大家好,我是智能仓储物流技术研习社的社长,老K。专注分享智能仓储物流技术、智能制造等内容。 新书《智能物流系统构成与技术实践》 近年来,随着智能仓储物流行业的快速发展,全球范围内的并购活动日益频繁,各大企…

Hamilton回路求解

如果可以 我想和你回到那天相遇 让时间停止 那一场雨 红线划过 深藏轮回的秘密 我挥霍运气 因为你 才让我 背对命运不害怕 --------- 如果可以 (Acapella) - 韦礼安 大家好,我又又又来了,今天给大家聊聊Hamilton回路! 背景 国际象…

VSCode通过SSH连接虚拟机Ubuntu失败

问题说明 最近使用VSCode通过SSH连接Ubuntu,通过VSCode访问Ubuntu进行项目开发,发现连接失败 在VSCode中进行SSH配置 这些都没有问题,但在进行连接时候出现了问题,如下: 出现了下面这个弹窗 解决方法 发现当…

从简单逻辑到复杂计算:感知机的进化与其在现代深度学习和人工智能中的应用(上)

文章目录 引言第一章:感知机是什么第二章:简单逻辑电路第三章:感知机的实现3.1 简单的与门实现3.2 导入权重和偏置3.3 使用权重和偏置的实现实现与门实现与非门和或门 文章文上下两节 从简单逻辑到复杂计算:感知机的进化与其在现代…

与 Apollo 共创生态:Apollo 7 周年大会的启示与心得

文章目录 前言Apollo X 全新征程Application X 企业预制套件总结 前言 在过去的七年中,Apollo 开放平台经历了一段令人瞩目的发展历程。从最初的构想到如今的成熟阶段,Apollo 已经推出了 13 个版本,吸引了来自全球 170 多个国家和地区的 16 …

python 中的数据结构

python 中的数据结构 1.1 序列 序列时有索引的数组 举例实现: a["北京","上海","广州","深圳","重庆","成都"] print(a[2]) print(a[-1] " " a[-2]) print(a[1:3]) # 运行结果 "&…

Java设计模式 _结构型模式_外观模式

一、外观模式 1、外观模式 外观模式(Facade Pattern)是一种结构型模式。主要特点为隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这有助于降低系统的复杂性,提高可维护性。当客户端与多个子系统之间存在大量…

使用Zotero自定义参考文献格式的教程

Zotero Zotero是一个开源的参考文献管理软件,它能够帮助研究人员和学生收集、管理和引用各种来源的文献,包括书籍、期刊文章、网页、图片等。用户可以使用Zotero将文献信息直接保存到自己的库中,并且可以根据需要创建标签、注释和文件夹来组…

Go实现树莓派控制舵机

公式说明 毫秒(ms)是时间的单位,赫兹(Hz)是频率的单位,而DutyMax通常是一个PWM(脉冲宽度调制)信号中表示最大占空比的值。以下是它们之间的关系和一些相关公式: 频率&…

软件测试与管理:黑盒测试-因果图法和场景法

知识思维导图: ​​​​​​​ 例题1:运用因果图法设计测试用例 有一个处理单价为5角钱的饮料的自动售货机软件测试用例的设计。其规格说明如下: 若投入5角钱或1元钱的硬币,按下〖橙汁〗或〖啤酒〗的按钮,则相应的饮料…

XSS-Labs 靶场通过解析(上)

前言 XSS-Labs靶场是一个专门用于学习和练习跨站脚本攻击(XSS)技术的在线平台。它提供了一系列的实验场景和演示,帮助安全研究人员、开发人员和安全爱好者深入了解XSS攻击的原理和防御方法。 XSS-Labs靶场的主要特点和功能包括:…

C++字模软件发送 单片机接收显示

/****先定义数组类型再赋值**L310*********/ /*2014 8 21 10:01**PAST*CODE1000**TEST**/ #include<reg51.h> #define uint unsigned int #define uchar unsigned char sfr AUXR0x8e; //辅助寄存器 sfr SADDR0xA9; …

后台启动HIVE的JDBC连接

后台启动HIVE的JDBC连接 生活就像一杯咖啡&#xff0c;有时苦涩&#xff0c;有时香甜&#xff0c;但都是值得品味的经历。无论遇到什么挑战&#xff0c;记住在每一天的开始&#xff0c;你都有机会给自己倒上一杯清新的力量&#xff0c;为心灵添一抹温暖。勇敢地面对生活的苦与甜…

aardio爬虫) 实战篇:逆向有道翻译web接口

前言 之前的文章把js引擎(aardio封装库) 微软开源的js引擎(ChakraCore))写好了&#xff0c;这篇文章整点js代码来测一下bug。测试网站&#xff1a;https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻译js逆向&#xff08;MD5加密&#xff0c;AES加密&…

Ubuntu上使用audit2allow解决Android Selinux问题

1.安装工具 sudo apt install policycoreutils 2.运行命令 提前用dmesg或者串口抓取kernel log 遇到错误&#xff0c;提示需要用-p指定policy file&#xff0c;然偶尝试创建一个policy空文件&#xff0c;用-p选项&#xff0c;遇到如下错误 3.规避问题 首先跟进错误log的堆栈…

【copilot 使用指南 - @workspace】

为什么需要workspace 默认情况下&#xff0c;copilot只能分析当前文件中的代码内容&#xff0c; 那么如何让copliot 跨文件分析&#xff0c;分析整个项目&#xff0c;分析整个代码目录下的代码&#xff0c;就要用到workspace&#xff0c;举例 &#xff1a;假设如下代码 index…

【图书推荐】《图神经网络基础、模型与应用实战》

本书目的 详解PyTorch 图神经网络基础理论、模型与十多个应用案例&#xff0c;带领读者掌握图神经网络在自然语言处理、计算机视觉、推荐系统、社交网络4个领域的应用开发方法&#xff0c;丰富读者利用深度学习算法解决实际问题的能力。 本书案例 图卷积网络实现图注意力网络…

【状态压缩 动态规划 数论】1799. N 次操作后的最大分数和

本文涉及知识点 状态压缩 动态规划 数论 动态规划汇总 LeetCode1799. N 次操作后的最大分数和 给你 nums &#xff0c;它是一个大小为 2 * n 的正整数数组。你必须对这个数组执行 n 次操作。 在第 i 次操作时&#xff08;操作编号从 1 开始&#xff09;&#xff0c;你需要&a…

UE5 UMG

锚点 参考链接&#xff1a;虚幻5UI系统&#xff08;UMG&#xff09;基础&#xff08;已完结&#xff09;_哔哩哔哩_bilibili

专注 APT 攻击与防御—基于UDP发现内网存活主机

UDP简介&#xff1a; UDP&#xff08;User Datagram Protocol&#xff09;是一种无连接的协议&#xff0c;在第四层-传输层&#xff0c;处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点&#xff0c;也就是说&#xff0c;当报文发送之后&#xf…