如何在调试期间在 FreeRTOS 任务列表中显示运行时

How to show runtime in FreeRTOS Task List during debugging

我正在开发一个嵌入式软件项目(ARM Cortex-M7、STM32F7 微控制器),系统 Workbench 适用于 STM32,它是基于 Eclipse 的 IDE。我已经从 NXP Kinetis Design Studio (KDS)1 安装了 "FreeRTOS Task Aware Debugger for GDB"。我想查看每个任务的运行时间,这应该可以通过 FreeRTOS 和这个插件实现。不幸的是,在任务列表中没有显示运行时。相反,它显示以下警告消息(另请参见屏幕截图):

Enable "configGENERATE_RUN_TIME_STATS" macro in FreeRTOSconfig.h to see "Runtime".

但是,我已经在 FreeRTOSconfig.h:

中启用了指定的宏和其他必要的宏
#define configGENERATE_RUN_TIME_STATS            1

/* Definitions needed when configGENERATE_RUN_TIME_STATS is on */
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS configureTimerForRunTimeStats
#define portGET_RUN_TIME_COUNTER_VALUE getRunTimeCounterValue

为什么插件在已经启用的情况下提示需要启用此宏?调试时如何在任务列表中看到运行时?


1 Eclipse 更新站点:http://freescale.com/lgfiles/updates/Eclipse/KDS

首先要做的是确定问题是出在调试器插件中(我不确定这是哪个)还是在构建中。为此,在 tasks.c 内的 xTaskIncrementTick() 中放置一个断点,然后查看 pxCurrentTCB 变量,它是一个指向 TCB 结构的指针。如果启用 运行 时间统计,则应该有一个名为 ulRunTimeCounter 的结构成员。那个结构成员在那里吗?如果是这样,它是否包含一个值?即使值是错误的,如果它在那里,似乎表明问题出在调试器中 plug-in.

根据this post解决方案是

#define portREMOVE_STATIC_QUALIFIER 1

这是有道理的,因为 FreeRTOS 源代码 (tasks.c) 包含以下注释:

/*
 * Some kernel aware debuggers require the data the debugger needs access to be
 * global, rather than file scope.
 */
#ifdef portREMOVE_STATIC_QUALIFIER
    #define static
#endif

并且在同一个文件中,相关变量确实定义为静态的:

#if ( configGENERATE_RUN_TIME_STATS == 1 )
    PRIVILEGED_DATA static uint32_t ulTaskSwitchedInTime = 0UL;
    PRIVILEGED_DATA static uint32_t ulTotalRunTime = 0UL;
#endif