【FreeRTOS(四)】显示任务详细信息

本文档介绍了如何利用vTaskList函数获取FreeRTOS操作系统的任务详细信息,包括任务状态、优先级和堆栈使用情况,以帮助优化内存管理和解决栈溢出问题。在使用该功能前,需要在FreeRTOSConfig.h中开启特定配置,并在ESP32或ESP8266上启用相关选项。示例代码展示了如何创建任务并调用vTaskList函数打印任务列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

显示任务详细信息 vTaskList

通过 vTaskList来协助分析操作系统当前 task 状态,以帮助优化内存,帮助定位栈溢出问题。

void vTaskList( char *pcWriteBuffer );
parameterdescription
pcWriteBuffer保存任务状态信息表的存储区,须足够大
return

pcWriteBuffe表中信息

  • Name:创建任务的时候给任务分配的名字
  • State:任务的状态信息,X:运行态,B:阻塞态,R:就绪态,S:挂起态,D:删除态
  • Priority:任务优先级
  • Stack:任务堆栈的“高水位线”,就是堆栈历史最小剩余值
  • Num:任务编号,这个编号是唯一的;当多个任务使用同一个任务名的时候;可以通过编号来区分
    在这里插入图片描述

注意事项:

  • 在使用vTaskList前需要在FreeRTOSConfig.h文件中打开configUSE_TRACE_FACILITYconfigUSE_TRACE_FACILITY

  • 如使用ESP32、ESP8266,需使能Enable FreeRTOS trace facilityEnable FreeRTOS stats formatting functions

    • make menuconfig -> Component config -> FreeRTOS -> Enable FreeRTOS trace facility
    • make menuconfig -> Component config -> FreeRTOS -> Enable FreeRTOS trace facility -> Enable FreeRTOS stats formatting functions

    通过上面配置,等同于使能 FreeRTOSConfig.h 中如下两个宏:
    configUSE_TRACE_FACILITY 和 configUSE_STATS_FORMATTING_FUNCTIONS

代码示例

#include <stdio.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"

void task1(void *pvParam)
{
    while (1)
    {
        printf("task1!\n");
        vTaskDelay(3000 / portTICK_PERIOD_MS);

        vTaskDelete(NULL);
    }
}

void task2(void *pvParam)
{
    while (1)
    {
        printf("task2!\n");
        vTaskDelay(3000 / portTICK_PERIOD_MS);

        vTaskDelete(NULL);
    }
}

void app_main(void)
{
    xTaskCreate(task1, "task1", 4096, NULL, 1, NULL);
    xTaskCreate(task2, "task2", 4096, NULL, 1, NULL);

    static char pcWriteBuffer[512] = {0};
    vTaskList(pcWriteBuffer);

    printf("-----------------------------------------");
    printf("Name    State   Priority    Stack   Num\n");
    printf("%s\n",pcWriteBuffer);
}
<think>好的,我需要帮助用户在FreeRTOS中统计任务的运行时间。首先,我应该回顾用户提供的引用内容,特别是引用[2]和引用[3],因为用户的问题是关于任务运行时间统计的。 根据引用[2],vTaskGetRunTimeStats()函数可以生成每个任务运行时间的统计信息,包括绝对值和百分比。这个函数依赖于uxTaskGetSystemState()来获取原始数据,然后转换成易读的ASCII表格。同时,用户需要配置运行时间统计时钟的频率,这通常在FreeRTOSConfig.h中设置。 接下来,我需要确认配置步骤。用户需要启用宏configGENERATE_RUN_TIME_STATS和configUSE_STATS_FORMATTING_FUNCTIONS,这两个宏在FreeRTOS的配置文件中必须设为1。此外,引用[2]提到需要提供两个宏:portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()和portGET_RUN_TIME_COUNTER_VALUE()。前者用于初始化计时器,后者用于获取当前计时器的值。用户需要根据硬件平台实现这两个宏,比如使用STM32的定时器。 然后,示例代码部分需要展示如何调用vTaskGetRunTimeStats()。通常,用户需要定义一个缓冲区来存储统计信息字符串,并在任务中定期调用该函数并打印结果。此外,确保系统时钟频率正确设置,例如configTICK_RATE_HZ为1000,这样时间单位是毫秒。 还要注意可能的注意事项,比如运行时统计对系统性能的影响,尤其是在高频率下。此外,定时器的溢出问题需要考虑,使用32位定时器可以延长溢出时间。引用[3]提到的xTimerStop可能与定时器管理相关,但当前问题主要关注任务统计,所以可能不需要深入讨论定时器停止功能。 最后,生成相关问题,帮助用户进一步了解优化方法、统计精度提升和应用场景。这些需要结合用户提供的引用内容和常见问题。</think>### FreeRTOS任务运行时间统计方法 在FreeRTOS中统计任务的运行时间主要通过以下API和配置实现: #### 1. **核心API函数** - **`vTaskGetRunTimeStats()`** 此函数将任务运行时间统计信息格式化为ASCII表格,显示每个任务消耗的CPU时间(绝对值和百分比)。其内部调用`uxTaskGetSystemState()`获取原始数据[^2]。 #### 2. **配置步骤** 1. **启用统计功能** 在`FreeRTOSConfig.h`中添加以下宏定义: ```c #define configGENERATE_RUN_TIME_STATS 1 // 启用运行时间统计 #define configUSE_STATS_FORMATTING_FUNCTIONS 1 // 允许格式化输出 ``` 2. **配置计时器** 需实现两个宏来初始化计时器和获取计数值: ```c #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() init_timer() // 初始化硬件定时器 #define portGET_RUN_TIME_COUNTER_VALUE() get_timer_value() // 获取当前计数值 ``` *示例(STM32使用TIM2定时器)*: ```c void init_timer() { __HAL_RCC_TIM2_CLK_ENABLE(); TIM2->PSC = SystemCoreClock / 1000000 - 1; // 1MHz时钟 TIM2->ARR = 0xFFFFFFFF; // 32位最大值 TIM2->CR1 |= TIM_CR1_CEN; } uint32_t get_timer_value() { return TIM2->CNT; } ``` #### 3. **示例代码** ```c void vTaskMonitor(void *pvParameters) { char pcStatsBuffer[512]; // 存储统计信息的缓冲区 while(1) { vTaskGetRunTimeStats(pcStatsBuffer); // 生成统计信息 printf("Task Runtime Stats:\n%s\n", pcStatsBuffer); // 输出到串口 vTaskDelay(pdMS_TO_TICKS(2000)); // 每2秒统计一次 } } ``` #### 4. **关键配置参数** - **`configTICK_RATE_HZ`** 系统节拍频率(通常设为1000,即1ms周期)[^3]。 - **运行统计时钟精度** 若定时器频率为1MHz,则统计分辨率为1μs。 #### 注意事项 1. **性能影响** 高频率的统计可能增加CPU负载,建议间隔时间不低于1秒。 2. **定时器溢出** 使用32位定时器可延长溢出周期(如1MHz时约71分钟)[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eiker_3169

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值