[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.rhkb.cn/news/339855.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文件上传题目练习

[HNCTF 2022 Week1]easy_upload 先尝试上传一个php文件,发现直接就成功了 用蚁剑测试连接成功 找到flag [NISACTF 2022]bingdundun~ 白名单上传 这里因为尝试了很多绕过方式都不成功,去搜索了一下wp,发现要用到Phar://伪协议 补充&#xff…

恒创科技:无法与服务器建立安全连接怎么解决?

在使用互联网服务时,有时会出现无法与服务器建立安全连接的问题,此错误消息通常出现在尝试访问需要安全连接的网站(例如使用 HTTPS 的网站)时,这可能是由于多种原因造成的,以下是一些常见的解决方法,帮助你解决问题。 …

VR导航的实现原理、技术优势和应用场景

VR导航通过虚拟现实技术提供沉浸式环境,结合室内定位技术实现精准导航。目前,VR导航已在多个领域展现出其独特的价值和潜力,预示着智能导航系统的未来发展。 一、实现原理 VR导航技术依托于虚拟现实(VR)和室内定位系统。VR技术利用计算机模…

先进的无人机GPS/GNSS模块解决方案

由于多星座支持和增强的信号接收能力,先进的GNSS模块提供了更高的精度和可靠性。集成传感器融合补偿信号中断,实现无缝导航。内置实时运动学(RTK)支持提供厘米级的定位精度。这些模块还优先考虑低功耗和紧凑的尺寸,确保更长的飞行时间和对无人…

2024.6.2练习情况—整数二分

2024.6.2练习情况—整数二分 一、例题Acwing789.数的范围 题目 代码 #include<iostream> #include<cstring> using namespace std; const int N 100100; int n,q,k;//题中变量 int arr[N]; //找左端点 void querryleft(int arr[],int k){ int l0,rn-1; …

list~模拟实现

目录 list的介绍及使用 list的底层结构 节点类的实现 list的实现 构造函数 拷贝构造 方法一&#xff1a;方法二&#xff1a; 析构函数 赋值重载 insert / erase push_/pop_(尾插/尾删/头插/头删) begin和end&#xff08;在已建立迭代器的基础上&#xff09; 迭代…

React@16.x(17)Portals

目录 1&#xff0c;使用2&#xff0c;事件冒泡 一句话总结&#xff1a;和 Vue3 的 Teleport 一个效果。 1&#xff0c;使用 import React, { PureComponent } from "react"; import ReactDOM from "react-dom";// 返回一个 React 元素&#xff08;ReactNo…

基于Cortex的MCU设计

基于Cortex的MCU设计 今日更新的存货文档&#xff0c;发现日更文章还是很花时间的。保证一周更新三篇文章就行啦&#xff0c;本篇文章的内容起始主要取自于《Cortex-M3 权威指南》和知网下载的论文。写的不详细&#xff0c;想进一步了解的就去看这篇文档或网上找别的资料&#…

爬虫利器Frida RPC入门——夜神模拟器环境篇

Frida是一款轻量级HOOK框架&#xff0c;可用于多平台上&#xff0c;例如android、windows、ios等。 frida分为两部分&#xff0c;服务端运行在目标机上&#xff0c;通过注入进程的方式来实现劫持应用函数&#xff0c;另一部分运行在系统机器上。frida上层接口支持js、python、…

香橙派 AIpro开发体验:使用YOLOV8对USB摄像头画面进行目标检测

香橙派 AIpro开发体验&#xff1a;使用YOLOV8对USB摄像头画面进行目标检测 前言一、香橙派AIpro硬件准备二、连接香橙派AIpro1. 通过网线连接路由器和香橙派AIpro2. 通过wifi连接香橙派AIpro3. 使用vscode 通过ssh连接香橙派AIpro 三、USB摄像头测试1. 配置ipynb远程开发环境1.…

C语言:(动态内存管理)

目录 动态内存有什么用呢 malloc函数 开辟失败示范 free函数 calloc函数 realloc函数 当然realooc也可以开辟空间 常⻅的动态内存的错误 对NULL指针的解引⽤操作 对动态内存开辟的空间越界访问 对⾮动态开辟内存使⽤free释放 使⽤free释放⼀块动态开辟内存的⼀部分 …

Mac逆向Electron应用

工具库 解压asar文件 第一步 找到应用文件夹位置 打开活动监视器&#xff1a; 搜索相关应用 用命令行打开刚才复制的路径即可 open Applications/XXX.app/Contents/Resources/app第二步 解压打包文件 解压asar文件

[深度学习]yolov10+deepsort+pyqt5实现目标追踪

YOLOv10DeepSORTPyQt5实现目标追踪系统 在现代智能监控系统中&#xff0c;目标追踪技术扮演着至关重要的角色。结合YOLOv10&#xff08;一种先进的实时目标检测算法&#xff09;与DeepSORT&#xff08;一种多目标追踪算法&#xff09;&#xff0c;并通过PyQt5构建用户界面&…

StretchSense:将手部动作无缝集成到Xsens全身动捕系统中

在动画制作中逼真的手部动作可以大幅提升角色的情感表现能力&#xff0c;这将使观众更加轻易的走进角色&#xff0c;感受角色的情感变化并更加快速的了解角色的性格特点。如性格外向的角色将拥有更加复杂的手部动作表达。因此有效加强角色的手部动画真实度有助于吸引更多的观众…

element table表格行列合并span-method,根据数据动态行列合并

表格行列合并需要用到 table的方法 span-method 根据数据来进行动态的行列合并&#xff0c;实例如下&#xff1a; <el-table:data"tableData":span-method"objectSpanMethod" style"width: 100%"><el-table-columnprop"key"l…

PCIe的链路状态

目录 概述 链路训练的目的 两个概念 下面介绍LTSSM状态机 概述 PCie链路的初始化过程较为复杂&#xff0c;Pcie总线进行链路训练时&#xff0c;将初始化Pcie设备的物理层&#xff0c;发送接收模块和相关的链路状态信息&#xff0c;当链路训练成功结束后&#xff0c;PCIe链…

xcode开发swift允许发送http请求设置

Xcode 现在新建项目默认只支持HTTPS请求&#xff0c;认为HTTP请求不安全&#xff0c;所以不支持。但是开发环境一般都是http模式&#xff0c;所以需要单独配置才可以访问。 需要到项目的设置里面&#xff0c;点击info&#xff0c;如果没有App Transport Security Setting这一项…

c# - - - winform 右下角气球提示通知

c# - - - winform 右下角气球提示通知 winform 右下角气球提示通知 1.1 winform 右下角气球提示通知 在工具箱中点击 NotifyIcon 控件&#xff0c;拖动到 Form1 窗体上添加这个控件。 在“提示”按钮的点击事件中写气球提示通知内容。 public partial class Form1 : Form {…

民国漫画杂志《时代漫画》第29期.PDF

时代漫画29.PDF: https://url03.ctfile.com/f/1779803-1248635405-bf3c87?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

《探索Stable Diffusion:AI绘画的创意之路与实战秘籍》

《Stable Diffusion AI 绘画从提示词到模型出图》介绍了 Stable Diffusion AI 绘画工具及其使用技巧。书中内容分为两部分&#xff1a;“基础操作篇”&#xff0c;讲解了 SD 文生图、图生图、提示词、模型、ControlNet 插件等核心技术的应用&#xff0c;帮助读者快速从新手成长…