FreeRTOS 小技巧(1)—— 打印系统当前的任务列表,任务状态,优先级,使用率,堆栈内存等信息

本文章讲述如何打印输出 FreeRTOS 系统当前的任务列表,任务状态优先级,使用率等信息。

一、vTaskList

使用 vTaskList() 函数以表格形式打印输出当前系统中所有信息

  • 任务名
  • 任务状态
  • 优先级
  • 剩余栈
  • 任务序号

使用示例如下:

void app_main()
{
    xTaskCreate(test_task, "test_task", 4096, NULL, 6, NULL);
    static char InfoBuffer[512] = {0};
    while (1) {
        vTaskList((char *) &InfoBuffer);
        printf("任务名      任务状态    优先级    剩余栈    任务序号\r\n");
        printf("\r\n%s\r\n", InfoBuffer);
        vTaskDelay(2000 / portTICK_PERIOD_MS);
    }
}

对应 log 打印如下:

 任务名      任务状态    优先级    剩余栈    任务序号

main           R         1       2996       2
IDLE0          R         0       1232       3
test_task      B         6       3460       5
Tmr Svc        B         1       2684       4
esp_timer      B         22      3632       1

二、vTaskGetRunTimeStats

使用 vTaskGetRunTimeStats() 打印输出每个任务的运行时间

  • 任务名
  • 运行计数
  • 使用率

使用示例如下:

void app_main()
{
    xTaskCreate(test_task, "test_task", 4096, NULL, 6, NULL);
    static char InfoBuffer[512] = {0};
    while (1) {
        vTaskGetRunTimeStats((char *) &InfoBuffer);
        printf("\r\n任务名          运行计数         使用率\r\n");
        printf("\r\n%s\r\n", InfoBuffer);
        vTaskDelay(2000 / portTICK_PERIOD_MS);
    }
}

对应 log 打印如下:

任务名          运行计数         使用率

main            56475           <1%
IDLE0           4091951         48%
test_task       4328356         50%
Tmr Svc         35              <1%
esp_timer       17606           <1%

 三、vTaskGetInfo

使用 vTaskGetInfo() 打印输出某个任务信息

  • 任务名
  • 任务编号
  • 任务壮态
  • 任务当前优先级
  • 任务基优先级
  • 任务堆栈基地址
  • 任务堆栈历史剩余最小值

使用示例如下:

void task_info_printf(void)
{
    //任务句柄
    const TaskHandle_t TaskHandleTb[] =
    {
        TaskHandle1, TaskHandle2, TaskHandle3
    };
    //输出堆栈中剩余空间(bytes)的大小和执行过程中剩余空间的最小值
    printf("===========");
    printf("FreeHeapSize : %d %d(byte)", xPortGetFreeHeapSize(), xPortGetMinimumEverFreeHeapSize());
    printf("===========\r\n");
    for(int i = 0; i < sizeof(TaskHandleTb) / sizeof(TaskHandleTb[0]); ++i)
    {
        TaskStatus_t TaskStatus;
        //获取任务信息
        vTaskGetInfo(TaskHandleTb[i], &TaskStatus, 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");
    vTaskDelay(1000);
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值