第17章 内存管理
约 525 字大约 2 分钟
2026-01-19
17.1 核心知识点
FreeRTOS 5种内存管理算法(了解):
heap_1:最简单,不允许释放内存。
heap_2:允许释放内存,但不会合并相邻的空闲块。
heap_3:简单包装了标准 malloc() 和 free(),以保证线程安全。
heap_4:合并相邻的空闲块以避免碎片化。包含绝对地址放置选项。
heap_5:如同 heap_4,能够跨越多个不相邻内存区域的堆。相关函数
pvPortMalloc() 申请内存
vPortFree() 释放内存
xPortGetFreeHeapSize() 获取当前空闲内存的大小17.1 案例
① 需求
task1:检测到按键 SW3 按下则申请内存,检测到按键 SW4 按下则释放内存,并打印剩余内存信息。② 代码
App_Task.c
#include "App_Task.h"
// 任务1 ------------------------------------
// 任务1函数的原型
void task1_callback(void *pvParameters);
// 任务1名称
#define TASK1_NAME "task1"
// 任务1堆栈大小
#define TASK1_STACK_SIZE 128
// 任务1的优先级
#define TASK1_PRIORITY 1
// 任务1的句柄
TaskHandle_t task1_handle;
/**
* @brief 启动 FreeRTOS 任务管理
*
*/
void App_Task_Start(void)
{
// 进入临界区
taskENTER_CRITICAL();
// 创建任务1
xTaskCreate(task1_callback, TASK1_NAME, TASK1_STACK_SIZE, NULL, TASK1_PRIORITY, &task1_handle) == pdPASS ? printf("任务1创建成功! \n") : printf("任务1穿件失败! \n");
taskEXIT_CRITICAL();
// 启动任务调度器 ( vTaskStartScheduler() 后面的代码不会被执行)
printf("任务调度器启动... \n");
vTaskStartScheduler();
}
// 任务1函数的实现
void task1_callback(void *pvParameters)
{
printf("任务1启动... \n");
// 定义指针,指向分配的内存区域
void *ptr = NULL;
while (1)
{
// 检测按键
switch (Int_Key_IsDetect())
{
case 3:
// 检测到按键SW3,申请分配一块内存
printf("任务1: 检测到按键SW3,申请分配一块内存... \n");
ptr = pvPortMalloc(128);
ptr == NULL ? printf("任务1: 申请内存失败! \n") : printf("任务1: 申请内存成功! \n");
break;
case 4:
// 检测到按键SW4,释放之前申请的内存
printf("任务1: 检测到按键SW4,释放之前申请的内存... \n");
vPortFree(ptr);
ptr = NULL;
break;
default:
break;
}
// 打印剩余内存空间
printf("任务1: 剩余内存空间为 %d 字节 \n", xPortGetFreeHeapSize());
// 延时500ms
vTaskDelay(500);
}
}