05 FreeRTOS - 常用调试函数 uxTaskGetNumberOfTasks

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

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值