我正在使用System Workbench for STM32(基于Eclipse的IDE)来开发嵌入式软件项目(ARM Cortex-M7,STM32F7微控制器)。我已经从NXP Kinetis Design Studio(KDS) 1 安装了“用于GDB的FreeRTOS Task Aware调试器”。我想查看每个任务的运行时,这在FreeRTOS和此插件中应该可以实现。不幸的是,在任务列表中没有显示运行时间。而是显示以下警告消息(另请参见屏幕截图):
Ford
但是,我已经在FreeRTOSconfig.h中启用了指定的宏和其他必要的宏:
Enable "configGENERATE_RUN_TIME_STATS" macro in FreeRTOSconfig.h to see "Runtime".
为什么该插件提到已启用此宏,所以需要将其启用?在调试过程中如何查看任务列表中的运行时?
1 Eclipse更新站点:http://freescale.com/lgfiles/updates/Eclipse/KDS
答案 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