[FreeRTOS 基础知识] 堆

文章目录

    • 堆的概念
    • 使用C语言实现 堆
    • 堆空间解析


堆的概念

所谓的堆就是一块空间的内存,可以来管理这块内存。从这块内存中取出一部分然后再释放回去。


使用C语言实现 堆

char heap_buf[1024];            // 定义一个堆空间
int pos=0;                      // 当前位置

void *my_malloc(int size)
{
    int old_pos = pos;           // 记录旧位置
    pos += size;                 // 更新位置点
    return &heap_buf[old_pos];   // 返回旧位置地址
}

根据堆的概念写出上面的代码。定义出一块堆的空间heap_buf,可以在这块堆空间上任意申请,使用和释放空间。
使用Keil单步调试,对堆heap_buf申请和使用情况
在这里插入图片描述
根据单步调试情况可以看出:buf分配的起始地址就是heap_buf 堆空间起始地址,并且完成对堆空间的写入。


堆空间解析

使用上面的代码可以实现简单堆空间的申请和使用,但是这种简单的malloc函数没有办法释放空间。如下图所示
在这里插入图片描述
假如第一次使用my_malloc分配100字节空间buf1,第二次使用my_malloc分配100字节空间buf2
此时去释放空间buf1的空间my_free(buf1),只知道buf1的起始地址,却不知道应该释放多大的内存空间。 因此使用简单的malloc无法实现释放空间。

在操作系统中对堆空间的管理,在分配实际内存前有一段头部空间,其中存放分配这段内存的相关信息包括分配的空间大小。
因此使用malloc函数申请堆空间时, 实际在堆空间中分配两部分:头部信息+实际可操作的堆空间。malloc返回值是实际可操作的堆空间的起始地址。
使用free函数释放空间时, 会根据传入的地址(实际可操作的堆空间的起始地址)减去固定的头部大小,找到头部中这块申请的堆空间大小。从而释放空间。
在这里插入图片描述

假如将buf2释放掉后,整个堆空间的空闲区域有buf2头部信息+50字节+其他空闲区域。这时要申请100空间的内存,应该如何分配呢?
为了解决这个问题,引入链表来解决。链表基本形式如下:

// 定义全局链表
struct head
{
    int size;
    struct head *next_free;
}

struct head g_heap;
g_heap.size = 0;
g_heap.next_free = NULL;

初始状态, 在堆内存空闲区域会构建一个头部,表明当前堆空闲大小以及下一个堆空闲的位置。
在这里插入图片描述
分配100字节空间。 会先判断g_heap.next_free所指向的头部中size的大小,若大于申请的空间就会划分出两块,一块为分配的空间,另一块为空闲空间。
在这里插入图片描述
以此类推,继续分配出50字节和100字节的空间
在这里插入图片描述
当执行free(buf2)函数,释放50字节的空间时,流程如下:
1、先将buf2的地址减去8,查找头部信息中的size为50
2、释放50+8字节的空间。
3、g_heap.next_free所指向空闲空间头部中next_free就会指向buf2已经释放的起始地址(上图中绿色的开头)。

这样,当下一个malloc的时候,会先看g_heap.next_free所指向空闲空间头部中size。
若大于申请的大小就划分空间;
若小于申请的大小就继续判断next_free所指向的size大小。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

牛客网刷题 | BC116 [NOIP2013]记数问题

目前主要分为三个专栏,后续还会添加: 专栏如下: C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读! 初来乍到,如有错误请指出,感谢! 描述 试计算在区间1 到n…

C++的vector使用优化

我们在上一章说了如何使用这个vector动态数组,这章我们说说如何更好的使用它以及它是如何工作的。当你创建一个vector,然后使用push_back添加元素,当当前的vector的内存不够时,会从内存中的旧位置复制到内存中的新位置&#xff0c…

pytorch+YOLOv8-1

1.工具开发 2.idea配置pytorch环境 默认安装新版本torch pip install torch 3.pytorch验证 4. print(torch.cuda.is_available()) 输出结果为 False 说明我只能用cpu

【动手学深度学习】softmax回归的简洁实现详情

目录 🌊1. 研究目的 🌊2. 研究准备 🌊3. 研究内容 🌍3.1 softmax回归的简洁实现 🌍3.2 基础练习 🌊4. 研究体会 🌊1. 研究目的 理解softmax回归的原理和基本实现方式;学习如何…

prometheus+alertmanager+webhook钉钉机器人告警

版本:centos7.9 python3.9.5 alertmanager0.25.0 prometheus2.46.0 安装alertmanager prometheus 配置webhook # 解压: tar -xvf alertmanager-0.25.0.linux-amd64.tar.gz tar -xvf prometheus-2.46.0.linux-amd64.tar.gz mv alertmanager-0.25.0.linu…

分享毕业论文要怎么写以及写论文工具推荐

毕业论文的写作是一个系统且需要深度研究的过程。以下将分步介绍毕业论文的写作方法,并推荐一些实用的写作工具。 毕业论文写作方法 选题: 确定研究方向和目标,选择具体且有一定研究价值的课题。建议选择应用型题目,结合理论和实…

【HarmonyOS】鸿蒙系统中应用权限等级介绍、定义、申请授权讲解

【HarmonyOS】鸿蒙系统中应用权限等级介绍、定义、申请授权讲解 针对权限等级,相对于主体来说,会有不同的细分概念。 一、权限APL等级: 首先在鸿蒙系统中,对于权限本身,分为三个等级:normal,s…

【JAVA WEB实用与优化技巧】如何使用本地.bat/.sh脚本快速将服务发布到测试环境?

文章目录 普通方式的springboot 使用docker打包发布【手动构建镜像模式】1. maven 打包可运行jar包2.手动打包镜像3.运行容器 全自动化本地命令发布到远程服务的方式配置ssh信任公钥获取公钥git 获取公钥方式: 桌面右键 -> open git gui here -> help -> show SSH key…

【数据库】MySQL表的操作

目录 一.创建表 二.查看表 三.修改表 四.删除表 一.创建表 基本语法: CREATE TABLE table_name(field1 datatype,field2 datatype,field3 datatype) character set 字符集 collate 校验规则 engine 储存引擎field表示列名 datatype表示列的类型 charatcer se…

初识C++ · 模拟实现stack和Queue

目录 前言: 1 Stack 1.1 双端队列 2 Queue 前言: 经历了list三个自定义类型的洗礼,来个简单的放松放松,即栈和队列: 文档记录的,栈和队列是一种容器适配器,它们不属于stl,但是它…

什么是云渲染?怎么使用呢?手把手教你

云渲染是一种利用云计算技术进行图形渲染的服务。它允许用户将渲染任务提交到云端服务器,由远程的计算机集群资源进行渲染操作,完成后再将渲染结果返回给用户。 云渲染技术的优势在于它可以提高渲染效率和质量,支持多任务同时加速渲染&#…

一个被无数人忽视的好项目

这个项目相信大家都在各大短视频平台见过,之前被我忽视了,当时的我自以为它是一时的热度,很快就会凉凉。但现在却生生被打脸了,这其实是非常好变现且流量也很大的一个好项目。 到底是什么好项目呢,没错,就…

[MYSQL]合作过至少三次的演员和导演

ActorDirector 表: ---------------------- | Column Name | Type | ---------------------- | actor_id | int | | director_id | int | | timestamp | int | ---------------------- timestamp 是这张表的主键(具有唯一值的列).编写解决方案…

黑马程序员——Spring框架——day04——SpringMVC基础

目录: SpringMVC简介 背景SpringMVC概述技术体系定位快速入门 目的需求步骤代码实操测试工具 PostMan简介PostMan安装PostMan使用知识点总结请求与参数处理 请求路径 环境准备问题分析解决方式请求方式 环境准备技术分析参数 基本数据类型POJO嵌套POJO数组集合&…

基于卷积神经网络(CNN)的深度迁移学习在声发射(AE)监测螺栓连接状况的应用

螺栓结构在工业中用于组装部件,它们在多种机械系统中扮演着关键角色。确保这些连接结构的健康状态对于航空航天、汽车和建筑等各个行业至关重要,因为螺栓连接的故障可能导致重大的安全风险、经济损失、性能下降和监管合规问题。 在早期阶段检测到螺栓松动…

四、利用启发式算法进行特定数据集的残差网络结构搜索【框架+源码】

背景:工作之后干的事情跟算法关联甚少,整理下读书期间的负责和参与的work,再熟悉学习下。 边熟悉边整理喽~ CV Tradictional workCV AI based work机械臂视觉抓取项目机器学习全流程 Pipeline训练平台OCR生产线喷码识别三维重建(SfM)ROS机器人…

springboot项目通过jar包部署到服务器

1. 将springboot项目打包成jar包 方式一:IDEA为例 出现 BUILD SUCCESS 证明打包成功,自动生成了 target 目录, jar 包就在目录里边 方式二:命令行(得配置好maven环境变量) 切换到项目目录下,…

springboot管理的各依赖版本查看

找一个springboot相关的依赖,比如这里我找mybatis 鼠标点击artifactId名称,图中蓝色字段,跳转到springboot依赖(鼠标悬停在上面变成蓝色表示可点击跳转), 点击spring-boot-dependencites,跳转到…

基于FPGA的SystemVerilog练习

文章目录 一、认识SystemVerilogSystemVerilog的语言特性SystemVerilog的应用领域SystemVerilog的优势SystemVerilog的未来发展方向 二、流水灯代码流水灯部分testbench仿真文件 三、用systemVerilog实现超声波测距计时器测距部分led部分数码管部分采样部分顶层文件引脚绑定效果…

QT入门知识回顾

1 QT简介 1.1 Qt模块: Qt Core模块: 是QT类库的核心,所有其他模块都依赖这个模块 Qt Gui模块: 提供GUI程序的基本功能 Qt Network模块:提供跨平台的网络功能 Qt Widgets模块:提供创建用户界面的功能 1.2Qt的signal/slot机制 任何一个类只要类体前部书写 Q_OBJ…