下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

内核
最新资讯
简化任何设备的身份验证云连接。
利用 CoAP 设计节能型云连接 IoT 解决方案。
11.0.0 版 FreeRTOS 内核简介:
FreeRTOS 路线图和代码贡献流程。
使用 FreeRTOS 实现 OPC-UA over TSN。

运行时间统计

点击放大

说明

FreeRTOS 可以选择性收集关于每个任务所用处理时间量的信息。 然后可以用 vTaskGetRunTimeStats() API 函数以表格形式显示此信息, 如右图所示。

每个任务有两个值:

  1. Abs 时间(绝对时间)

    指实际执行任务所耗费的总时间,即任务处于 “正在运行”状态的总时间。 由用户为其应用程序选择合适的时间基数。

  2. % 时间(时间百分比)

    实质上,这里显示的是相同的信息,只不过是以占总处理时间的百分比形式显示, 而非绝对时间。

配置和使用

需要三个宏。 这些宏可以在 FreeRTOSConfig.h 中定义。
  1. configGENERATE_RUN_TIME_STATS

    通过将 configGENERATE_RUN_TIME_STATS 定义为 1,启用收集运行时统计信息。 一旦完成此设置,还必须定义另外两个宏,以确保能成功 编译。

  2. portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()

    运行时统计信息的时间基数需要比 tick 中断具有更高的分辨率—— 否则统计信息可能会不准确,无法真正发挥作用。 建议将 此时间基数设置为比 tick 中断快 10 到 100 倍。 时间基数越快, 统计数据就越准确——但定时器值也会越早溢出。

    如果将 configGENERATE_RUN_TIME_STATS 定义为 1,那么 RTOS 内核会 在启动时自动调用 portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() (从 vTaskStartScheduler() API 中进行调用)。 应用程序设计人员希望 使用宏来配置合适的时间基数。 下面举例说明。

  3. portGET_RUN_TIME_COUNTER_VALUE()

    此宏应只返回当前的时间,正如 portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() 所配置的那样。 下面提供了一些示例。

vTaskGetRunTimeStats() API 函数用于检索收集的统计数据。


示例

[其中包括] LPC17xx LPCXpressoLM3Sxxxx Eclipse Web 服务器演示应用程序被配置为生成运行时统计信息。


LM3Sxxxx 示例

LM3Sxxxx Eclipse 演示应用程序已经包含一个 20 KHz 定时器测试。 中断处理程序已更新为 每次执行时只增加一个名为 ulHighFrequencyTimerTicks 的变量。 portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() 只需将此变量设置为 0,portGET_RUN_TIME_COUNTER_VALUE() 会返回其值。 要实现这一点,请将以下几行添加到 FreeRTOSConfig.h:


extern volatile unsigned long ulHighFrequencyTimerTicks;
/* ulHighFrequencyTimerTicks is already being incremented at 20KHz.  Just set
its value back to 0. */
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() ( ulHighFrequencyTimerTicks = 0UL )
#define portGET_RUN_TIME_COUNTER_VALUE()	ulHighFrequencyTimerTicks


LPC17xx 示例

LPC17xx 演示应用程序不包括高频中断测试,因此 portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() 用于配置定时器 0 外围设备,以生成时间基数。 portGET_RUN_TIME_COUNTER_VALUE() 只返回 当前定时器 0 计数器值。 这通过以下函数和宏实现。


/* Defined in main.c. */
void vConfigureTimerForRunTimeStats( void )
{
const unsigned long TCR_COUNT_RESET = 2,
                    CTCR_CTM_TIMER = 0x00,
                    TCR_COUNT_ENABLE = 0x01;

    /* Power up and feed the timer with a clock. */
    PCONP |= 0x02UL;
    PCLKSEL0 = (PCLKSEL0 & (~(0x3<<2))) | (0x01 << 2);

    /* Reset Timer 0 */
    T0TCR = TCR_COUNT_RESET;

    /* Just count up. */
    T0CTCR = CTCR_CTM_TIMER;

    /* Prescale to a frequency that is good enough to get a decent resolution,
    but not too fast so as to overflow all the time. */
    T0PR =  ( configCPU_CLOCK_HZ / 10000UL ) - 1UL;

    /* Start the counter. */
    T0TCR = TCR_COUNT_ENABLE;
}

/* Defined in FreeRTOSConfig.h. */
extern void vConfigureTimerForRunTimeStats( void );
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() vConfigureTimerForRunTimeStats()
#define portGET_RUN_TIME_COUNTER_VALUE() T0TC





Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.