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

时间:2019-06-21 12:11:53

标签: eclipse debugging stm32 freertos

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

Ford

screenshot

但是,我已经在FreeRTOSconfig.h中启用了指定的宏和其他必要的宏:

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

为什么该插件提到已启用此宏,所以需要将其启用?在调试过程中如何查看任务列表中的运行时?


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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

根据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