FreeRTOS中至少保持两个任务

FreeRTOS中至少保持两个任务

在FreeRTOS中至少保持两个任务

  1. LED灯闪烁任务,检测程序是否在正常运行
  2. 信息打印任务,打印任务的数量、每个任务的剩余堆栈数量和任务的状态

一、 LED闪烁任务

/**
  * @brief	LED每隔500ms闪烁,表示程序正在运行
  * @param  
  * @retval 
  */
void LED(void * pvParameters)
{
	while(1)
	{
		LED0=~LED0;
		vTaskDelay(500);
	}
}

二、信息打印任务

串口打印数据

/**
  * @brief	信息打印(当前有多少任务,每个任务剩余的堆栈数量,和任务当前的状态)
  *			0:运行	1:就绪态	2:阻塞态	3:挂起态	4:任务删除,但TCB还没回收
  * @param  
  * @retval 
  */
void message_task(void * pvParameters)
{
	
	UBaseType_t task_num=0;
	TaskStatus_t * task_state_arry=NULL;
	UBaseType_t task_WaterMark=0;
	int i=0;
	
	
	while(1)
	{
		task_num=uxTaskGetNumberOfTasks();
		printf("任务数量\t%ld\r\n",task_num);
	
		task_state_arry=mymalloc(SRAMIN,sizeof(TaskStatus_t)*task_num);
		if(task_num != uxTaskGetSystemState( task_state_arry,task_num,NULL)) printf("uxTaskGetSystemState err\r\n");
	
		for(i=0;i<task_num;i++)
		{
			task_WaterMark=uxTaskGetStackHighWaterMark(task_state_arry[i].xHandle);
			printf("%s任务的剩余堆栈数量\t%ld,任务当前状态:%d\r\n",task_state_arry[i].pcTaskName,task_WaterMark,task_state_arry[i].eCurrentState);
		}
		printf("\r\n\r\n");
		/*记得释放内存,不然一段时间后可分配内存就满了*/
		myfree(SRAMIN,task_state_arry);
		vTaskDelay(5000);
	}
}

三、完整代码

1、FreeRTOS_demo.c

#include "FreeRTOS_demo.h"
#include "FreeRTOS.h"
#include "task.h"
#include "malloc.h"
#include "led.h"


/*开始任务参数*/
void start_task(void * pvParameters);
#define START_STK_SIZE			128
#define START_TASK_PRIO			1
TaskHandle_t StartTask_Handler;

/*LED参数*/
void LED(void * pvParameters);
#define LED_STK_SIZE			50
#define LED_TASK_PRIO			2
TaskHandle_t LED_Handler;

/*message_task参数*/
void message_task(void * pvParameters);
#define MESSAGE_STK_SIZE			100
#define MESSAGE_TASK_PRIO			3
TaskHandle_t MESSAGE_Handler;

/**
  * @brief	FreeRTOS任务创建
  * @param  
  * @retval 
  */
void FreeRTOS_demo(void)
{
	BaseType_t xReturned;
	
	xReturned=xTaskCreate( (TaskFunction_t				) start_task,
                           (const char *				) "start_task", 
                           (configSTACK_DEPTH_TYPE		) START_STK_SIZE,
                           (void *						) NULL,
                           (UBaseType_t					) START_TASK_PRIO,
                           (TaskHandle_t *				) &StartTask_Handler );
	
	if(xReturned==errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY) printf("start_task创建失败\n");
	vTaskStartScheduler();
}

/**
  * @brief	开始任务进行创建任务
  * @param  
  * @retval 
  */
void start_task(void * pvParameters)
{	
	BaseType_t xReturned;
	
	/*进入临界区*/
	taskENTER_CRITICAL();
	
	xReturned=xTaskCreate( (TaskFunction_t				) LED,
                           (const char *				) "LED", 
                           (configSTACK_DEPTH_TYPE		) LED_STK_SIZE,
                           (void *						) NULL,
                           (UBaseType_t					) LED_TASK_PRIO,
                           (TaskHandle_t *				) &LED_Handler );
	
	if(xReturned==errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY) printf("LED创建失败\n");
						   
	xReturned=xTaskCreate( (TaskFunction_t				) message_task,
                           (const char *				) "message_task", 
                           (configSTACK_DEPTH_TYPE		) MESSAGE_STK_SIZE,
                           (void *						) NULL,
                           (UBaseType_t					) MESSAGE_TASK_PRIO,
                           (TaskHandle_t *				) &MESSAGE_Handler );
	
	if(xReturned==errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY) printf("message_task创建失败\n");
	vTaskDelete(StartTask_Handler);
		
	/*退出临界区*/
	taskEXIT_CRITICAL();
	
}

/**
  * @brief	LED每隔500ms闪烁,表示程序正在运行
  * @param  
  * @retval 
  */
void LED(void * pvParameters)
{
	while(1)
	{
		LED0=~LED0;
		vTaskDelay(500);
	}
}

/**
  * @brief	信息打印(当前有多少任务,每个任务剩余的堆栈数量,和任务当前的状态)
  *			0:运行	1:就绪态	2:阻塞态	3:挂起态	4:任务删除,但TCB还没回收
  * @param  
  * @retval 
  */
void message_task(void * pvParameters)
{
	
	UBaseType_t task_num=0;
	TaskStatus_t * task_state_arry=NULL;
	UBaseType_t task_WaterMark=0;
	int i=0;
	
	
	while(1)
	{
		task_num=uxTaskGetNumberOfTasks();
		printf("任务数量\t%ld\r\n",task_num);
	
		task_state_arry=mymalloc(SRAMIN,sizeof(TaskStatus_t)*task_num);
		if(task_num != uxTaskGetSystemState( task_state_arry,task_num,NULL)) printf("uxTaskGetSystemState err\r\n");
	
		for(i=0;i<task_num;i++)
		{
			task_WaterMark=uxTaskGetStackHighWaterMark(task_state_arry[i].xHandle);
			printf("%s任务的剩余堆栈数量\t%ld,任务当前状态:%d\r\n",task_state_arry[i].pcTaskName,task_WaterMark,task_state_arry[i].eCurrentState);
		}
		printf("\r\n\r\n");
		/*记得释放内存,不然一段时间后可分配内存就满了*/
		myfree(SRAMIN,task_state_arry);
		vTaskDelay(5000);
	}
}
#ifndef __FREERTOS_DEMO_H
#define __FREERTOS_DEMO_H

#include "sys.h"

void FreeRTOS_demo(void);

#endif

2、main.c

#include "sys.h"
#include "usart.h"
#include "malloc.h"
#include "led.h"
#include "FreeRTOS_demo.h"



int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4	 
	uart_init(115200);					//初始化串口
	my_mem_init(SRAMIN);
	LED_Init();		  					//初始化LED
	
	FreeRTOS_demo();
}
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值