【freertos】008-内存管理

本文深入解析FreeRTOS的内存管理,重点介绍了heap5内存管理的细节,包括初始化、内存申请、释放、数据结构和相关接口。内容涵盖堆空间初始化、内存块插入空闲链表、内存申请和释放的完整代码实现,以及如何获取堆信息。
摘要由CSDN通过智能技术生成

🚀 优质资源分享 🚀

学习路线指引(点击解锁) 知识定位 人群定位
🧡 Python实战微信订餐小程序 🧡 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
💛Python量化交易实战💛 入门级 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

目录* 前言


前言

本章主要讲解内部存储空间(RAM)的管理。

详细分析heap5方案。

参考:

8.1 C标准库的内存管理

C标准库的内存管理用到的API是malloc()free(),但是不建议在RTOS中直接调用,因为:

  1. C标准库的内存管理实现可能比较大,不适合小型嵌入式RAM不足的设备。
  2. 可能会产生内存碎片,对于安全性要求高的嵌入式设备不适合。
  3. 这两个函数会使得链接器配置得复杂。
  4. 待补充。

8.2 freertos内存管理接口

freertos的内存管理和内核实现是相互独立的,内核规定内存管理接口,而接口内容却是可由外部自由实现。

但是freertos官方也提供了几种内存分配算法:heap1、heap2、heap3、heap4、heap5。

所以,需要内存管理的有合适的算法可以单独使用freertos提供内存分配算法到自己的设备或系统中。

内存堆大小由宏configTOTAL_HEAP_SIZE决定。(heap3方案除外)

/*
 * Map to the memory management routines required for the port.
 */
void * pvPortMalloc( size\_t xSize ) PRIVILEGED\_FUNCTION;    //内存申请函数
void vPortFree( void * pv ) PRIVILEGED\_FUNCTION;            //内存释放函数
void vPortInitialiseBlocks( void ) PRIVILEGED\_FUNCTION;     //初始化内存堆函数
size\_t xPortGetFreeHeapSize( void ) PRIVILEGED\_FUNCTION;    //获取当前未分配的内存堆大小
size\_t xPortGetMinimumEverFreeHeapSize( void ) PRIVILEGED\_FUNCTION; //获取未分配的内存堆历史最小值

8.3 freertos五种内存管理

简单介绍。

8.3.1 heap1

特点:

  1. 只能申请不能释放。
  2. 不会产生内存碎片。
  3. 函数的执行时间是确定的。因为可直接查到空闲空间地址和大小。

应用:这种方案一般用在安全性要求较高的系统中。用于从不删除任务、队列、信号量、互斥量等的应用程序。

实现:

使用xNextFreeByte来定位下一个空闲的内存堆位置。

因为freertos系统堆是一个大数组,所以,内存空间是连续的。

所以xNextFreeByte值在heap1方案中实际保存的是已经被分配的内存大小,下次申请时跳过这些已申请的,剩下就是空闲空间。

pucAlignedHeap是一个指向对齐后的内存堆起始地址。

用户提供的系统堆内存的起始地址不一定是对齐的内存地址,需要纠正,纠正后的系统堆内存起始地址保存在pucAlignedHeap

static size\_t xNextFreeByte = ( size\_t ) 0;
static uint8\_t *pucAlignedHeap = NULL;

API注意:

  1. vPortInitialiseBlocks()仅仅将静态局部变量xNextFreeByte设置为0,表示内存没有被申请。
  2. xPortGetFreeHeapSize()并不是释放内存,因为heap1方案不支持释放,所以该API是获取当前未分配的内存堆大小。

8.3.2 heap2

特点:

  1. 支持动态申请和释放。
  2. 链表管理,但是不支持拼接相邻空闲块。所以容易产生内存碎片。
  3. 申请时间具有不确定性,因为检索空闲块需要检索链表,空闲块多、内存碎片多时,检索会久点。但是效率比标准C库中的malloc函数高得多。

应用:不建议用于内存分配和释放是随机大小的应用程序。

实现:

heap2方案的内存管理链表:

typedef struct A\_BLOCK\_LINK {
    struct A\_BLOCK\_LINK *pxNextFreeBlock;
    size\_t xBlockSize;
} BlockLink\_t;

pxNextFreeBlock:是指向下一个空闲内存块的指针。

xBlockSize:记录当前内存块大小。(内存管理函链表结构体)

8.3.3 heap3

特点:

  1. 需要链接器设置一个堆,malloc()和free()函数由编译器提供。
  2. 具有不确定性。
  3. 很可能增大RTOS内核的代码大小。
  4. configTOTAL_HEAP_SIZE不起作用,因为堆空间由编译器决定提供的。一般在启动文件里设置。

实现:

heap3方案只是简单的封装了标准C库中的malloc()和free()函数。

重新封装后的malloc()和free()函数具有保护功能,采用的封装方式是操作内存前挂起调度器、完成后再恢复调度器。

8.3.4 heap4

和heap2方案类似,且支持相邻空闲块拼接,降低内存块碎片化几率。

特点:

  1. 支持动态申请和释放。
  2. 按地址升序,优先返回第一个满足size需求的空闲块。
  3. 链表管理,支持相邻空闲块拼接。
  4. 申请时间具有不确定性,因为检索空闲块需要检索链表,但是效率比标准C库中的malloc函数高得多。

应用:

  • 可用于重复删除任务、队列、信号量、互斥量等的应用程序。
  • 可用于分配和释放随机字节内存的应用程序。

8.3.5 heap5

heap_5.c方案在实现动态内存分配时与heap4.c方案一样&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值