6.1 vTaskGetInfo函数原型
/*********************************************************************************
* 函数名: vTaskGetInfo
* 功能: 得到任务的信息
* 输入: xTask[查询的任务的句柄]
* pxTaskStatus[存储任务信息的结构体地址]
* xGetFreeStackSpace[是否统计任务堆栈历史最小剩余大小 pdTRUE为是,其他为否]
* eState[是否获取任务状态 eInvalid为是,其他为否]
* 输出: 无(任务信息在输入的结构体地址里面保存)
*********************************************************************************/
void vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState )
6.2 实验应用
#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 128
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); //延时1s,也就是1000个时钟节拍
}
}
//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); //延时1s,也就是1000个时钟节拍
}
}
//RunTimeStats任务
void RunTimeStats_task(void *pvParameters)
{
TaskStatus_t TaskStatus;
//获取LED0_Task的任务信息
vTaskGetInfo((TaskHandle_t )Task1Task_Handler, //任务句柄
(TaskStatus_t* )&TaskStatus, //任务信息结构体
(BaseType_t )pdTRUE, //允许统计任务堆栈历史最小剩余大小
(eTaskState )eInvalid); //获取任务运行壮态
//通过串口打印出指定任务的有关信息。
printf("任务名: %s\r\n",TaskStatus.pcTaskName);
printf("任务编号: %d\r\n",(int)TaskStatus.xTaskNumber);
printf("任务壮态: %d\r\n",TaskStatus.eCurrentState);
printf("任务当前优先级: %d\r\n",(int)TaskStatus.uxCurrentPriority);
printf("任务基优先级: %d\r\n",(int)TaskStatus.uxBasePriority);
printf("任务堆栈基地址: %#x\r\n",(int)TaskStatus.pxStackBase);
printf("任务堆栈历史剩余最小值:%d\r\n",TaskStatus.usStackHighWaterMark);
printf("\r\n");
//获取LED0_Task的任务信息
vTaskGetInfo((TaskHandle_t )Task2Task_Handler, //任务句柄
(TaskStatus_t* )&TaskStatus, //任务信息结构体
(BaseType_t )pdTRUE, //允许统计任务堆栈历史最小剩余大小
(eTaskState )eInvalid); //获取任务运行壮态
//通过串口打印出指定任务的有关信息。
printf("任务名: %s\r\n",TaskStatus.pcTaskName);
printf("任务编号: %d\r\n",(int)TaskStatus.xTaskNumber);
printf("任务壮态: %d\r\n",TaskStatus.eCurrentState);
printf("任务当前优先级: %d\r\n",(int)TaskStatus.uxCurrentPriority);
printf("任务基优先级: %d\r\n",(int)TaskStatus.uxBasePriority);
printf("任务堆栈基地址: %#x\r\n",(int)TaskStatus.pxStackBase);
printf("任务堆栈历史剩余最小值:%d\r\n",TaskStatus.usStackHighWaterMark);
while(1)
{
vTaskDelay(10); //延时10ms,也就是1000个时钟节拍
}
}
输出结果:
任务名: task1_task
任务编号: 1
任褡程 1
任务当前畔燃 2
任务基优先级: 2
任务堆栈基地址: 0x200004e0
任务堆栈历史剩余最小值:117
任务名: task2_task
任务编号: 2
任务壮态: 1
任务当前优先级: 3
任窕畔燃 3
任务堆栈基地址 0x20000758
任务堆栈历史剩余最小值:117