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);
    }
}

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

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

相关文章

VCoder:大语言模型的眼睛

简介 VCoder的一个视觉编码器,能够帮助MLLM更好地理解和分析图像内容。提高模型在识别图像中的对象、理解图像场景方面的能力。它可以帮助模型显示图片中不同物体的轮廓或深度图(显示物体距离相机的远近)。还能更准确的理解图片中的物体是什…

(Java基础知识综合)

进制转换&#xff1a; 其他转10 10转其他 2进制8和16 8和16转2 位运算&#xff1a; >> 除于2 <<乘以2 近似值 空心金字塔 this关键字还可以用于访问父类中的属性和方法

axios 二次封装 设置token

// 公有 axios.defaults.headers.common[Y-Auth-Token]eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c 设置后 并发起请求&#xff0c;你可以在浏览器控制台…

电脑提示“KBDRU1.DLL文件缺失”,导致游戏和软件无法启动运行,快速修复方法

看到很多小伙伴&#xff0c;在问电脑启动某些软件或游戏的时候&#xff0c;提示“KBDRU1.DLL文件缺失&#xff0c;软件无法启动&#xff0c;请尝试重新安装&#xff0c;解决问题”&#xff0c;不知道应该怎么办&#xff1f; 首先&#xff0c;我们要先了解“KBDRU1.DLL文件”是什…

数据结构学习 jz16 数值的整数次方

关键词&#xff1a;快速幂 位运算 之前已经学过快速幂了&#xff0c;所以只是回忆。快速幂有递归版和非递归版。 题目&#xff1a; 这道题和之前的快速幂的区别是 n可能为负数。分类讨论即可。 思路&#xff1a; 区分正负&#xff1a; if (n < 0) return POW(1.0 / x, …

ASUS华硕ROG幻14笔记本2023款G14 GA402XV原装出厂Win11系统

华硕幻14锐龙R9-7940HS笔记本电脑原厂Windows11.22H2系统 适用型号&#xff1a;GA402XU、GA402XV、GA402XI、GA402XY、GA402XZ 链接&#xff1a;https://pan.baidu.com/s/1sMva1u7D8uFoGnm2Hjrdug?pwdho91 提取码&#xff1a;ho91 原厂系统自带所有驱动、出厂主题壁纸、…

AWS EKS1.26+kubesphere3.4.1

1、前提准备 1台EC2服务器Amazon Linux2&#xff0c;设置admin的角色 安装 aws cli V2 ​ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"unzip awscliv2.zipsudo ./aws/installexport PATH/usr/local/bin:$PATHsou…

pod进阶版(2)

startupProbe启动探针 如果探测失败,pod的状态是notready&#xff0c;启动探针会重启容器 启动探针没有成功之前&#xff0c;后续的探针都不会执行。启动探针成功之后&#xff0c;在pod的后续生命周期不会用启动探针 exec方式 正确示范 apiVersion: v1 kind: Pod metadata…

【React系列】react-router

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. 认识react-router 1.2. 前端路由原理 前端路由是如何做到URL和内容进行映射呢&#xff1f;监听URL的改变。 UR…

【优选算法】专题三:二分查找 --- 34. 在排序数组中查找元素的第一个和最后一个位置

从今天开始,xxxflower 带着小伙伴们一起学习算法 ~ 今天我们要写的题目是: 34. 在排序数组中查找元素的第一个和最后一个位置 以下是题目的详细解析: class Solution {public int[] searchRange(int[] nums, int target) {// 判断数组为空的情况下返回-1,-1int[] ret new in…

在centos上安装WordPress 及创建配置文件无反应的解决方案

一、安装Apache服务 1.直接在命令行中输入以下命令即可,顺便安装编译组件&#xff1a; yum install -y httpd yum install -y httpd-devel2.启动Apache服务和设置Apache自启&#xff1a; 1 systemctl start httpd 2 systemctl enable httpd 3.添加一个测试页面&#xff0c;…

4《数据结构》

文章目录 绪论逻辑结构存储结构【物理结构】顺序和链式存储区别顺序表和数组区别数组和链表的区别链表结点概念链表为空条件链表文章http://t.csdnimg.cn/dssVK二叉树B树B树【MYSQL索引默认数据结构】B树和B树区别冒泡排序插排选排快排 绪论 数据结构&#xff1a;研究非数值计…

Html5实用个人博客留言板模板源码

文章目录 1.设计来源1.1 主界面1.2 认识我界面1.3 我的日记界面1.4 我的文章列表界面和文章内容界面1.5 我的留言板界面 2.演示效果和结构及源码2.1 效果演示2.2 目录结构2.3 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151…

关于MySQL Cluster

目录 1.MySQL Cluster2.MySQL Cluster架构3.MySQL Cluster 与 MySQL 主从架构有什么区别4.参考 MySQL Cluster是MySQL的一个高可用性&#xff0c;高性能的分布式数据库解决方案。它结合了内存数据库和共享无状态架构的技术&#xff0c;提供了99.999%的可用性&#xff0c;满足严…

经典目标检测YOLO系列(一)YOLOV1的复现(1)总体架构

经典目标检测YOLO系列(一)实现YOLOV1网络(1)总体架构 实现原版的YOLOv1并没有多大的意义&#xff0c;因此&#xff0c;根据《YOLO目标检测》(ISBN:9787115627094)一书&#xff0c;在不脱离YOLOv1的大部分核心理念的前提下&#xff0c;重构一款较新的YOLOv1检测器&#xff0c;来…

【EI会议征稿通知】第十届先进制造技术与应用材料国际学术会议(ICAMMT 2024)

第十届先进制造技术与应用材料国际学术会议&#xff08;ICAMMT 2024&#xff09; The 10th International Conference on Applied Materials and Manufacturing Technology 至今ICAMMT已连续举办九届&#xff0c;会议先后在三亚、杭州、清远等城市成功召开。每一届最终征集收…

K8S--部署SpringBoot项目实战

原文网址&#xff1a;K8S--部署SpringBoot项目实战-CSDN博客 简介 本文介绍K8S如何部署SpringBoot项目。 1.生成应用的docker镜像 把SpringBoot项目的jar包打包为docker镜像&#xff0c;见&#xff1a;Docker Compose--部署SpringBoot项目--实战-CSDN博客 创建后的镜像名称…

Django和Vue项目运行过程中遇到的问题及解决办法

这是我从CSDN上边买来的一个系统的资源&#xff0c;准备在此基础上改成自己的系统&#xff0c;但是在运行项目这一步上都把自己难为了好几天&#xff0c;经过不断的摸索&#xff0c;终于完成了第一步&#xff01;&#xff01;&#xff01; 如果大家也遇到同样的问题&#xff0…

Docker基础学习(配置、命令)

镜像加速 登录阿里云 docker run hello-world分析命令&#xff1a; 开始–>docker在本机中寻找镜像–>有–>以该镜像为模版生产容器实例运行&#xff1b; 开始–>docker在本机中寻找镜像–>无–>去远端下载镜像并运行&#xff0c;若远端无此镜像则返回错误…

【教育会议征稿】第五届教育、知识和信息管理国际学术会议(ICEKIM 2024)

第五届教育、知识和信息管理国际学术会议&#xff08;ICEKIM 2024&#xff09; 2024 5th International Conference on Education, Knowledge and Information Management 第五届教育、知识和信息管理国际学术会议&#xff08;ICEKIM 2024&#xff09;定于4月19至21日在中国成…