FreeRTOS内存管理

FreeRTOS内存管理

FreeRTOS内存管理简介

在这里插入图片描述

程序

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
#include "lcd.h"
#include "key.h"
#include "beep.h"
#include "string.h"
#include "malloc.h"
#include "FreeRTOS.h"
#include "task.h"

//优先级
#define START_TASK_PRIO		1
//堆栈大小
#define START_STK_SIZE 		128  
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);

//ÈÎÎñÓÅÏȼ¶
#define MALLOC_TASK_PRIO	2
//ÈÎÎñ¶ÑÕ»´óС	
#define MALLOC_STK_SIZE 	128
//ÈÎÎñ¾ä±ú
TaskHandle_t MallocTask_Handler;
//ÈÎÎñº¯Êý
void malloc_task(void *p_arg);

int main(void)
{ 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
	delay_init(168);					
	uart_init(115200);     				
	LED_Init();		        			
	KEY_Init();						
	LCD_Init();							
	my_mem_init(SRAMIN);            	//初始化内部内存池
	
	POINT_COLOR = RED;
	LCD_ShowString(30,10,200,16,16,"STM32F407");	
	LCD_ShowString(30,30,200,16,16,"FreeRTOS Examp 20-1");
	LCD_ShowString(30,50,200,16,16,"Mem Manage");
	LCD_ShowString(30,70,200,16,16,"KEY_UP:Malloc,KEY1:Free");
	LCD_ShowString(30,90,200,16,16,"KEY0:Use Mem");
	LCD_ShowString(30,110,200,16,16,"ATOM@ALIENTEK");
	LCD_ShowString(30,130,200,16,16,"2016/11/14");
	
	LCD_ShowString(30,170,200,16,16,"Total Mem:      Bytes");
	LCD_ShowString(30,190,200,16,16,"Free  Mem:      Bytes");
	LCD_ShowString(30,210,200,16,16,"Message:    ");
	POINT_COLOR = BLUE;
	
	//创建开始任务
    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();          //开启任务调度器
}

//开始任务
void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();           //进入临界区
    //创建malloc_task任务
    xTaskCreate((TaskFunction_t )malloc_task,             
                (const char*    )"malloc_task",           
                (uint16_t       )MALLOC_STK_SIZE,        
                (void*          )NULL,                  
                (UBaseType_t    )MALLOC_TASK_PRIO,        
                (TaskHandle_t*  )&MallocTask_Handler);   
    vTaskDelete(StartTask_Handler); //删除开始任务
    taskEXIT_CRITICAL();            //退出临界区
}


//MALLOC任务函数
void malloc_task(void *pvParameters)
{
	u8 *buffer;		
	u8 times,i,key=0;
	u32 freemem;

	LCD_ShowxNum(110,170,configTOTAL_HEAP_SIZE,5,16,0);//显示内存大小
    while(1)
    {
		key=KEY_Scan(0);
		switch(key)
		{
			case WKUP_PRES:				
				buffer=pvPortMalloc(30);			//申请内存,30个字节
				printf("申请到的内存地址:%#x\r\n",(int)buffer);
				break;
			case KEY1_PRES:				
				if(buffer!=NULL)vPortFree(buffer);	//释放内存
				buffer=NULL;
				break;
			case KEY0_PRES:
				if(buffer!=NULL)					//使用内存buffer
				{
					times++;
					sprintf((char*)buffer,"User %d Times",times);//写入数据向内存中
					LCD_ShowString(94,210,200,16,16,buffer);
				}
				break;
		}
		freemem=xPortGetFreeHeapSize();		//获取剩余内存大小
		LCD_ShowxNum(110,190,freemem,5,16,0);//显示内存总容量	
		i++;
		if(i==50)
		{
			i=0;
			LED0=~LED0;
		}
        vTaskDelay(10);
    }
} 


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值