FreeRTOS——内存管理知识总结及实战

1 freeRTOS动态创建与静态创建

动态创建:从FreeRTOS 管理的内存堆中申请创建对象所需的内存,在对象删除后,
这块内存释放回FreeRTOS管理的内存堆中
静态创建:需用户提供各种内存空间,并且使用静态方式占用的内存空间一般固定下来了,即使任务、队列等被删除后,这些被占用的内存空间一般没有其他用途

2 FreeRTOS内存管理算法

在这里插入图片描述
常用算法 heap_4

3 4种算法详解

3.1 heap_1

/* 定义一个大数组作为 FreeRTOS 管理的内存堆 */
static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];

3.2 heap_2

heap_2 内存管理算法使用最适应算法,并且支持释放内存,但不能将相邻的空闲内存块合并成一个大的空闲内存块。
在这里插入图片描述

3.3 heap_4

使用了首次适应算法,也支持内存的申请与释放,并且能够将空闲且相邻的内存进行合并,从而减少内存碎片的现象。
在这里插入图片描述

3.4 heap_5

1)heap_5 内存管理算法是在 heap_4 内存管理算法的基础上实现的,但是 heap_5 内存管理算法在 heap_4 内存管理算法的基础上实现了管理多个非连续内存区域的能力
2)heap_5 内存管理算法默认并没有定义内存堆 , 需要用户手动指定内存区域的信息,对其进行初始化。

typedef struct HeapRegion{uint8_t * 	pucStartAddress; 	/* 内存区域的起始地址 */size_t 		xSizeInBytes; 	/* 内存区域的大小,单位:字节 */} HeapRegion_t; Const  HeapRegion_t  xHeapRegions[] ={{ (uint8_t *)0x80000000, 0x10000 }, 	/* 内存区域 1 */{ (uint8_t *)0x90000000, 0xA0000 }, 	/* 内存区域 2 */{ NULL, 0 } 					       /* 数组终止标志*/ };vPortDefineHeapRegions(xHeapRegions); 

适用场景:在嵌入式系统中,那些内存的地址并不连续的场景。

4 FreeRTOS内存管理相关API函数

在这里插入图片描述
1)申请内存
void * pvPortMalloc( size_t xWantedSize );
形参:
xWantedSize:申请的内存大小,以字节为单位
返回值:
其他指针 成功
NULL 申请内存失败

2)释放内存
void vPortFree( void * pv );
形参:
pv: 指针指向一个要释放内存的内存块

3)获取当前空闲内存大小
size_t xPortGetFreeHeapSize( void )
返回值:
size_t 返回当前剩余的空闲内存大小

4 FreeRTOS内存管理实战

在这里插入图片描述

#include "freertos_demo.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
/*FreeRTOS*********************************************************************************************/
#include "FreeRTOS.h"
#include "task.h"/******************************************************************************************************/
/*FreeRTOS配置*//* START_TASK 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
#define START_TASK_PRIO 1                   /* 任务优先级 */
#define START_STK_SIZE  128                 /* 任务堆栈大小 */
TaskHandle_t            StartTask_Handler;  /* 任务句柄 */
void start_task(void *pvParameters);        /* 任务函数 *//* TASK1 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
#define TASK1_PRIO      2                   /* 任务优先级 */
#define TASK1_STK_SIZE  128                 /* 任务堆栈大小 */
TaskHandle_t            Task1Task_Handler;  /* 任务句柄 */
void task1(void *pvParameters);             /* 任务函数 *//******************************************************************************************************//*** @brief       FreeRTOS例程入口函数* @param       无* @retval      无*/
void freertos_demo(void)
{xTaskCreate((TaskFunction_t )start_task,            /* 任务函数 */(const char*    )"start_task",          /* 任务名称 */(uint16_t       )START_STK_SIZE,        /* 任务堆栈大小 */(void*          )NULL,                  /* 传入给任务函数的参数 */(UBaseType_t    )START_TASK_PRIO,       /* 任务优先级 */(TaskHandle_t*  )&StartTask_Handler);   /* 任务句柄 */vTaskStartScheduler();
}/*** @brief       start_task* @param       pvParameters : 传入参数(未用到)* @retval      无*/
void start_task(void *pvParameters)
{taskENTER_CRITICAL();           /* 进入临界区 *//* 创建任务1 */xTaskCreate((TaskFunction_t )task1,(const char*    )"task1",(uint16_t       )TASK1_STK_SIZE,(void*          )NULL,(UBaseType_t    )TASK1_PRIO,(TaskHandle_t*  )&Task1Task_Handler);vTaskDelete(StartTask_Handler); /* 删除开始任务 */taskEXIT_CRITICAL();            /* 退出临界区 */
}/*** @brief       task1* @param       pvParameters : 传入参数(未用到)* @retval      无*/
void task1(void *pvParameters)
{uint8_t key = 0,t = 0;uint8_t * buf =NULL;while (1){key = key_scan(0);//申请内存if(key == KEY0_PRES){buf = pvPortMalloc(30);if(buf != NULL){printf("内存申请成功\r\n");}else{printf("内存申请失败\r\n");}}//释放内存else if(key == KEY1_PRES){if(buf != NULL){vPortFree(buf);printf("内存释放成功\r\n");}}//获取空闲内存大小if(t++ >50){t=0;printf("剩余空闲内存大小:%d\r\n",xPortGetFreeHeapSize());}vTaskDelay(10);}
}

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

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

相关文章

分配器allocators

STL六大组件之一分配器allocators 分配器&#xff1a;负责空间的配置与管理&#xff08;写在容器类型的后面&#xff0c;如右图&#xff0c;作用是帮容器分配内存&#xff0c;一般都 会省略不写&#xff0c;源代码有默认的&#xff09; #include <vector>vector<…

linux下安装Nginx及其常用命令

安装Nginx 接下来在Linux服务器进行操作就可以了 安装插件 yum -y install gcc pcre-devel zlib-devel openssl openssl-devel直接使用wget进行安装(如果没有wget需要先安装wget) yum install wgetwget https://nginx.org/download/nginx-1.24.0.tar.gz解压 tar -zxvf nginx..…

python的课后练习总结4(while循环)

for循环用于针对序列中的每个元素的一个代码块。 while循环是不断的运行&#xff0c;直到指定的条件不满足为止。 while 条件&#xff1a; 条件成立重复执行的代码1 条件成立重复执行的代码2 …….. i 1while i < 5:print(i)i i 11、使用wh…

pypdf 将 PDF两个页面拼接成一个页面进一步详解

pypdf 原库名Pypdf2(已弃用&#xff0c;文档 PyPDF2 RectangleObject类_w3cschool) pypdf 官方文档 The Transformation Class — pypdf 3.17.4 documentation pypdf 将两个PDF页面在x轴&#xff0c;y轴进行平移调整位置之后&#xff0c;直接用merge_page拼接在一起&#xff…

python学习曲线绘制

1. 学习曲线的绘制 learning_curve的使用案例 learning_curve 函数是 Scikit-learn 库中用于生成学习曲线的工具。以下是该函数的主要参数及其解释&#xff1a; estimator: 模型估计器&#xff08;estimator&#xff09;&#xff0c;即要评估性能的机器学习模型。这是必需的参…

KubeSphere 社区双周报 | 2023.12.21-2024.01.04

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者&#xff0c;并对近期重要的 PR 进行解析&#xff0c;同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为&#xff1a;2023.12.21-2024.…

AOP(面向切面编程)基于注解方式配置

不会注解的小伙伴看这里哦&#xff1a;Spring常用注解&#xff01;&#xff01;&#xff01;-CSDN博客 pom.xml <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version&g…

Python从入门到网络爬虫(内置函数详解)

前言 Python 内置了许多的函数和类型&#xff0c;比如print()&#xff0c;input()等&#xff0c;我们可以直接在程序中使用它们&#xff0c;非常方便&#xff0c;并且它们是Python解释器的底层实现的&#xff0c;所以效率是比一般的自定义函数更有效率。目前共有71个内置函数&…

苹果Mac图像修图软件Photomator和Pixelmator Pro 有什么区别?

同为一个团队设计的Mac修图软件Photomator和Pixelmator Pro有哪些区别呢&#xff1f;有哪些不一样的功能&#xff1f; Photomator和Pixelmator Pro区别如下&#xff1a; 1、用途不同 Photomator 和 Pixelmator Pro 是两个功能强大的应用程序&#xff0c;具有两个不同的用途。…

Mysql 将表里的两列值数据互换

示例&#xff1a; 需要将表中的 两个订单号互换 方案&#xff1a; 将同一张表数据做 临时数据 和主表 做数据交互 。 update 表 as main, 表 as temp set main.bill_no temp.track_bill_no, main.track_bill_no temp.bill_no where main.id temp.id…

小程序购物商城搭建开发分析

小程序商城作为现代商业模式的重要组成部分&#xff0c;具有巨大的发展潜力和商业价值。通过搭建一个功能完善、用户友好的小程序商城&#xff0c;您将能够提供便捷的购物体验&#xff0c;吸引更多的用户并实现商业增长。在进行小程序商城开发搭建之前&#xff0c;我们需要对项…

利用C#实现贪吃蛇

说明 本文根据B站up主唐老狮的课程所学所记 目录 说明本文根据B站up主唐老狮的课程所学所记 UML面向对象七大原则总体实现目标单一职责原则&#xff08;SRP&#xff0c;Single Responsibility Principle&#xff09;开闭原则&#xff08;OCP&#xff0c;Open-Closed Principle…