内存管理
内存管理简介
内存管理实验
1、实验目的:学习使用 FreeRTOS 内存管理,并观察内存在申请和释放过程中内存大小的变化情况
2、实验设计:将设计两个任务:start_task、task1
start_task:用来创建task1任务
task1:用于按键扫描,当KEY0按下则申请内存,当KEY1按下则释放内存,并打印剩余内存信息
freertos_demo.c
#include "freertos_demo.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
#include "./SYSTEM/delay/delay.h"
/*FreeRTOS*********************************************************************************************/
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "semphr.h"
/******************************************************************************************************/
/*FreeRTOS配置*/
/* START_TASK 任务 配置
* 包括: 任务句柄 任务优先级 堆栈大小 创建任务
*/
#define START_TASK_PRIO 1
#define START_TASK_STACK_SIZE 128
TaskHandle_t start_task_handler;
void start_task( void * pvParameters );
/******************************************************************************************************/
/* task1 任务 配置
* 包括: 任务句柄 任务优先级 堆栈大小 创建任务
*/
#define TASK1_PRIO 2
#define TASK1_STACK_SIZE 128
TaskHandle_t task1_handler;
void task1( void * pvParameters );
/******************************************************************************************************/
/**
* @brief FreeRTOS例程入口函数
* @param 无
* @retval 无
*/
void freertos_demo(void)
{
xTaskCreate( (TaskFunction_t ) start_task,
(char * ) "start_task",
(configSTACK_DEPTH_TYPE) START_TASK_STACK_SIZE,
(void * ) NULL,
(UBaseType_t ) START_TASK_PRIO,
(TaskHandle_t * ) &start_task_handler );
vTaskStartScheduler();
}
// Task to be created.
void start_task( void * pvParameters )
{
taskENTER_CRITICAL();
xTaskCreate( (TaskFunction_t ) task1,
(char * ) "task1",
(configSTACK_DEPTH_TYPE) TASK1_STACK_SIZE,
(void * ) NULL,
(UBaseType_t ) TASK1_PRIO,
(TaskHandle_t * ) &task1_handler );
vTaskDelete(start_task_handler);
taskEXIT_CRITICAL();
}
//申请内存,释放内存,显示空闲内存
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);
}
}