FreeRTOS中至少保持两个任务
在FreeRTOS中至少保持两个任务
- LED灯闪烁任务,检测程序是否在正常运行
- 信息打印任务,打印任务的数量、每个任务的剩余堆栈数量和任务的状态
一、 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();
}