首页 > 其他分享 >[FreeRTOS 基础知识] 堆

[FreeRTOS 基础知识] 堆

时间:2024-06-03 21:33:45浏览次数:16  
标签:malloc 字节 FreeRTOS free 基础知识 heap 空间 size

文章目录


堆的概念

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


使用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大小。

标签:malloc,字节,FreeRTOS,free,基础知识,heap,空间,size
From: https://blog.csdn.net/weixin_43564241/article/details/139424578

相关文章

  • LLM基础知识
    LLM背景知识介绍1大语言模型(LLM)背景大语言模型(英文:LargeLanguageModel,缩写LLM)是一种人工智能模型,旨在理解和生成人类语言.大语言模型可以处理多种自然语言任务,如文本分类、问答、翻译、对话等等。......
  • 八、FreeRTOS学习笔记-临界段代码保护及调度器挂起与恢复
    临界段代码保护什么是临界段:临界段代码也叫做临界区,是指那些必须完整运行,不能被打断的代码段适用场合如:问题:什么可以打断当前程序的运行?1、临界段代码保护函数介绍FreeRTOS在进入临界段代码的时候需要关闭中断,当处理完临界段代码以后再打开中断函数描述taskENTE......
  • Java基础知识
    2.第一个Java应用2.1创建Java源文件Java应用由一个或多个扩展名为.java的文件构成。publicclassDoll{/**福娃的名字*/privateStringname;/**构造方法*/publicDoll(Stringname){this.name=name;//设置福娃的名字}......
  • 【网络基础知识】-- 服务框架图s
    ......
  • 七、FreeRTOS学习笔记-中断管理
    FreeRTOS学习笔记-中断管理中断:让CPU打断正常运行的程序,转而去处理紧急的事件(程序)中断执行机制,可简单概括为三步:1、中断请求:外设产生中断请求(GPIO外部中断、定时器中断等)2、响应中断:CPU停止执行当前程序,转而去执行中断处理程序(ISR)3、退出中断:执行完毕,返回被打断的程序处,继续......
  • 计算机组装与维护的基础知识-计算机配件选购-基础篇
    此处采用了扫描件,转化为了图片,供给大家参考。......
  • 图解SQL基础知识,小白也能看懂的SQL文章!
    本文介绍关系数据库的设计思想:在SQL中,一切皆关系。在计算机龄域有许多伟大的设计理念和思想,例如:在Unix中,一切皆文件。在面向对象的编程语言中,一切皆对象。关系数据库同样也有自己的设计思想:在SQL中,一切皆关系。关系模型(Relationalmodel)由E.F.Codd博士于1970年......
  • 基于FREERTOS的STM32多功能手表(软件设计)
    目录前言程序现象 项目背景项目介绍目前版本实现的功能设计到的freertos知识使用到的硬件硬件连线图实现思路任务调度流程图​编辑 任务具体操作导图      代码讲解freertos初始化按键中断回调函数显示时间任务显示菜单任务其它任务(ShowCalenda......
  • 第一部 分基础知识
            本书的第一部分介绍编写Python程序所需要熟悉的基本概念,其中很多都适用于所有编程语言,因此它们在你的整个程序员生涯中都很有用。        第1章介绍在计算机中安装Python,并运行第一个程序——它在屏幕上打印消息“Helloworld!”。        第......
  • FreeRTOS基础(三):动态创建任务
       上一篇博客,我们讲解了FreeRTOS中,我们讲解了创建任务和删除任务的API函数,那么这一讲,我们从实战出发,规范我们在FreeRTOS下的编码风格,掌握动态创建任务的编码风格,达到实战应用!目录一、任务函数二、动态创建任务的基本步骤2.1使能FreeRTOS的API函数2.2 定义动态创......