/*********************************************************************************
* 函数名: vTaskList
* 功能: 查看任务信息
* 输入: pcWriteBuffer[任务信息存放的地址]
* 输出: 无
*********************************************************************************/
void vTaskList( char * pcWriteBuffer )
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "timer.h"
#include "string.h"
#include "FreeRTOS.h"
#include "task.h"
#define TASK1_TASK_PRIO 2 //任务优先级
#define TASK1_STK_SIZE 128 //任务堆栈大小
TaskHandle_t Task1Task_Handler; //任务句柄
void task1_task(void *pvParameters);//任务函数
#define TASK2_TASK_PRIO 3
#define TASK2_STK_SIZE 256
TaskHandle_t Task2Task_Handler;
void task2_task(void *pvParameters);
#define RUNTIMESTATS_TASK_PRIO 4
#define RUNTIMESTATS_STK_SIZE 128
TaskHandle_t RunTimeStats_Handler;
void RunTimeStats_task(void *pvParameters);
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
delay_init(168); //初始化延时函数
uart_init(38400); //初始化串口
//创建TASK1任务
xTaskCreate((TaskFunction_t )task1_task,
(const char* )"task1_task",
(uint16_t )TASK1_STK_SIZE,
(void* )NULL,
(UBaseType_t )TASK1_TASK_PRIO,
(TaskHandle_t* )&Task1Task_Handler);
//创建TASK2任务
xTaskCreate((TaskFunction_t )task2_task,
(const char* )"task2_task",
(uint16_t )TASK2_STK_SIZE,
(void* )NULL,
(UBaseType_t )TASK2_TASK_PRIO,
(TaskHandle_t* )&Task2Task_Handler);
//创建RunTimeStats任务
xTaskCreate((TaskFunction_t )RunTimeStats_task,
(const char* )"RunTimeStats_task",
(uint16_t )RUNTIMESTATS_STK_SIZE,
(void* )NULL,
(UBaseType_t )RUNTIMESTATS_TASK_PRIO,
(TaskHandle_t* )&RunTimeStats_Handler);
vTaskStartScheduler(); //开启任务调度
}
//task1任务函数
void task1_task(void *pvParameters)
{
u32 task1_num=0;
while(1)
{
task1_num++;
while(task1_num<5000)
{
task1_num++;
}
vTaskDelay(4);
}
}
//task2任务函数
void task2_task(void *pvParameters)
{
u32 task2_num=0;
while(1)
{
task2_num++;
while(task2_num<999999)
{
task2_num++;
task2_num = task2_num * 2;
task2_num = task2_num / 2;
}
vTaskDelay(10);
}
}
//RunTimeStats任务
void RunTimeStats_task(void *pvParameters)
{
char InfoBuffer[1024];
vTaskDelay(10);
vTaskList(InfoBuffer); //获取所有任务的信息
printf("%s\r\n",InfoBuffer); //通过串口打印所有任务的信息
while(1)
{
vTaskDelay(1000);
}
}
输出结果:(依次是 任务名称, 运行状态,任务优先级,剩余堆栈大小,任务编号)
RunTimeStats_task R 4 117 3
task2_task R 3 118 2
task1_task R 2 117 1
IDLE R 0 119 4
Tmr Svc S 31 235 5
备注:
开始时输出结果如下,任务2堆栈太小了(128),导致的剩余堆栈为0,并且把任务1的名称丢了,增大为256正常了。
RunTimeStats_task R 4 117 3
task2_task R 3 0 2
R 2 117 1
IDLE R 0 119 4
Tmr Svc S 31 235 5