FreeRTOS_内存管理

犀利的毛毛虫 发布于 2025-03-12 412 次阅读


FreeRTOS内存管理相关API函数介绍(熟悉)

内存管理相关函数如下:

函数描述
void * pvPortMalloc( size_t  xWantedSize );申请内存
void  vPortFree( void * pv );释放内存
size_t  xPortGetFreeHeapSize( void );获取当前空闲内存的大小

freertos_demo.c代码清单

#include "freertos_demo.h"
/* freertos相关的头文件,必须的 */
#include "FreeRTOS.h"
#include "task.h"
/* 需要用到的其他头文件 */
#include "LED.h"
#include "Key.h"

/* 启动任务的配置 */
#define START_TASK_STACK 128
#define START_TASK_PRIORITY 1
TaskHandle_t start_task_handle;
void start_task(void *pvParameters);

/* 任务1的配置 */
#define TASK1_STACK 128
#define TASK1_PRIORITY 2
TaskHandle_t task1_handle;
void task1(void *pvParameters);

/**
 * @description: 启动FreeRTOS
 * @return {*}
 */
void freertos_start(void)
{
    /* 1.创建一个启动任务 */
    xTaskCreate((TaskFunction_t)start_task,               // 任务函数的地址
                (char *)"start_task",                     // 任务名字符串
                (configSTACK_DEPTH_TYPE)START_TASK_STACK, // 任务栈大小,默认最小128,单位4字节
                (void *)NULL,                             // 传递给任务的参数
                (UBaseType_t)START_TASK_PRIORITY,         // 任务的优先级
                (TaskHandle_t *)&start_task_handle);      // 任务句柄的地址

    /* 2.启动调度器:会自动创建空闲任务 */
    vTaskStartScheduler();
}

/**
 * @description: 启动任务:用来创建其他Task
 * @param {void} *pvParameters
 * @return {*}
 */
void start_task(void *pvParameters)
{
    /* 进入临界区:保护临界区里的代码不会被打断 */
    taskENTER_CRITICAL();

    /* 创建3个任务 */
    xTaskCreate((TaskFunction_t)task1,
                (char *)"task1",
                (configSTACK_DEPTH_TYPE)TASK1_STACK,
                (void *)NULL,
                (UBaseType_t)TASK1_PRIORITY,
                (TaskHandle_t *)&task1_handle);
    /* 启动任务只需要执行一次即可,用完就删除自己 */
    vTaskDelete(NULL);

    /* 退出临界区 */
    taskEXIT_CRITICAL();
}

/**
 * @description: 任务一:当KEY1按下则申请内存,当KEY2按下则释放内存,并打印剩余内存信息
 * @param {void} *pvParameters
 * @return {*}
 */
void task1(void *pvParameters)
{
    uint8_t key = 0;
    void *buff = 0;
    while (1)
    {
        key = Key_Detect();
        if (key == KEY1_PRESS)
        {
            /* 申请内存:实际申请会比传入的参数还大,多出两部分:① 堆结构体的大小;② 字节对齐会浪费一部分 */
            buff = pvPortMalloc(20);
            printf("申请20内存,当前剩余空闲内存=%d\r\n", xPortGetFreeHeapSize());
        }
        else if (key == KEY2_PRESS)
        {
            /* 释放内存 */
            vPortFree(buff);
            printf("释放内存,当前剩余空闲内存=%d\r\n", xPortGetFreeHeapSize());
        }

        vTaskDelay(500);
    }
}