1 获取系统中任务个数函数:uxTaskGetNumberOfTasks
/*********************************************************************************
* 函数名: uxTaskGetNumberOfTasks
* 功能: 获取系统中任务个数函数
* 输入: 无
* 输出: 系统中任务的个数
*********************************************************************************/
UBaseType_t uxTaskGetNumberOfTasks( void )
2 获取系统中任务状态
TaskStatus_t 结构体,用来记录任务的信息
uxTaskGetSystemState 函数,用来获取任务信息, 函数可以获得的任务信息如下结构体所示
typedef struct xTASK_STATUS
{
TaskHandle_t xHandle; // 任务句柄
const char *pcTaskName; // 任务名字
UBaseType_t xTaskNumber; //任务编号
eTaskState eCurrentState; // 当前任务状态
UBaseType_t uxCurrentPriority; // 任务当前的优先级
UBaseType_t uxBasePriority; // 任务基础优先级
uint32_t ulRunTimeCounter; // 任务运行的总时间 需打开宏configGENERATE_RUN_TIME_STATS
StackType_t *pxStackBase; // 堆栈基地址
uint16_t usStackHighWaterMark; // 任务堆栈剩余的最小大小
} TaskStatus_t;
/*********************************************************************************
* 函数名: uxTaskGetSystemState
* 功能: 查询各个任务的信息,如上结构体描述
* 输入: pxTaskStatusArray [存放信息的结构体首地址]
uxArraySize [存放信息的结构体大小]
pulTotalRunTime [任务运行总时间地址]
* 输出: 统计到的任务个数
* 备注: 信息存放到输入的地址里面,宏configUSE_TRACE_FACILITY为1才能使用该函数
*********************************************************************************/
UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray,
const UBaseType_t uxArraySize,
uint32_t * const pulTotalRunTime )
3 示例
#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)
{
u32 TotalRunTime;
UBaseType_t ArraySize,x;
TaskStatus_t *StatusArray;
vTaskDelay(1000);
ArraySize=uxTaskGetNumberOfTasks(); //获取系统任务数量
StatusArray=pvPortMalloc(ArraySize*sizeof(TaskStatus_t));//申请内存
if(StatusArray!=NULL) //内存申请成功
{
ArraySize=uxTaskGetSystemState((TaskStatus_t* )StatusArray, //任务信息存储数组
(UBaseType_t )ArraySize, //任务信息存储数组大小
(uint32_t* )&TotalRunTime);//保存系统总的运行时间
for(x=0;x<ArraySize;x++)
{
printf("%s:\txTaskNumber:%d, uxBasePriority: %d, eCurrentState:%d, ulRunTimeCounter: %d,usStackHighWaterMark:%d\r\n",
StatusArray[x].pcTaskName,(int)StatusArray[x].xTaskNumber,(int)StatusArray[x].uxBasePriority,(int)StatusArray[x].eCurrentState,
(int)StatusArray[x].ulRunTimeCounter,(int)StatusArray[x].usStackHighWaterMark);
}
printf("TotalRunTime = %d\r\n",TotalRunTime);
}
vPortFree(StatusArray); //释放内存
while(1)
{
vTaskDelay(10); //延时10ms,也就是1000个时钟节拍
}
}
实验结果入下,可以看到每个任务的时间状态优先级等信息:
RunTimeStats_task: xTaskNumber:3, uxBasePriority: 4, eCurrentState:1, ulRunTimeCounter: 0, usStackHighWaterMark:96
task2_task: xTaskNumber:2, uxBasePriority: 3, eCurrentState:1, ulRunTimeCounter: 605, usStackHighWaterMark:107
IDLE: xTaskNumber:4, uxBasePriority: 0, eCurrentState:1, ulRunTimeCounter: 19390, usStackHighWaterMark:107
task1_task: xTaskNumber:1, uxBasePriority: 2, eCurrentState:2, ulRunTimeCounter: 3, usStackHighWaterMark:107
Tmr Svc: xTaskNumber:5, uxBasePriority: 31, eCurrentState:3, ulRunTimeCounter: 1, usStackHighWaterMark:235
TotalRunTime = 20002