06 FreeRTOS - 常用调试函数(二) vTaskGetInfo()

本文介绍了FreeRTOS中vTaskGetInfo函数的使用,展示了如何获取任务的基本信息,如优先级、堆栈状态等,并通过示例展示了如何在实验应用中创建、调度和监控多个任务。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值