运行时间统计
点击放大
说明
FreeRTOS 可以选择性收集关于每个任务所用处理时间量的信息。
然后可以用 vTaskGetRunTimeStats() API 函数以表格形式显示此信息,
如右图所示。
每个任务有两个值:
- Abs 时间(绝对时间)
指实际执行任务所耗费的总时间,即任务处于
“正在运行”状态的总时间。 由用户为其应用程序选择合适的时间基数。
- % 时间(时间百分比)
实质上,这里显示的是相同的信息,只不过是以占总处理时间的百分比形式显示,
而非绝对时间。
配置和使用
需要三个宏。 这些宏可以在 FreeRTOSConfig.h 中定义。
- configGENERATE_RUN_TIME_STATS
通过将 configGENERATE_RUN_TIME_STATS 定义为 1,启用收集运行时统计信息。
一旦完成此设置,还必须定义另外两个宏,以确保能成功
编译。
- portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()
运行时统计信息的时间基数需要比 tick 中断具有更高的分辨率——
否则统计信息可能会不准确,无法真正发挥作用。 建议将
此时间基数设置为比 tick 中断快 10 到 100 倍。 时间基数越快,
统计数据就越准确——但定时器值也会越早溢出。
如果将 configGENERATE_RUN_TIME_STATS 定义为 1,那么 RTOS 内核会
在启动时自动调用 portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()
(从 vTaskStartScheduler() API 中进行调用)。 应用程序设计人员希望
使用宏来配置合适的时间基数。 下面举例说明。
- portGET_RUN_TIME_COUNTER_VALUE()
此宏应只返回当前的时间,正如 portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() 所配置的那样。
下面提供了一些示例。
vTaskGetRunTimeStats() API 函数用于检索收集的统计数据。
示例
[其中包括] LPC17xx LPCXpresso
和 LM3Sxxxx 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.