如何在调试期间在 FreeRTOS 任务列表中显示运行时
Posted
技术标签:
【中文标题】如何在调试期间在 FreeRTOS 任务列表中显示运行时【英文标题】:How to show runtime in FreeRTOS Task List during debugging 【发布时间】:2019-11-04 07:01:31 【问题描述】:我正在使用 System Workbench for STM32(一个基于 Eclipse 的 IDE)开发嵌入式软件项目(ARM Cortex-M7、STM32F7 微控制器)。我已经从 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
【问题讨论】:
【参考方案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
【讨论】:
没有为我修复它,仍然在统计栏中显示 NA @Ali80,这很烦人。那时我已经为此苦苦挣扎了一段时间,并且确实感觉没有按预期 100% 工作。也许使用不同的设置(没有优化)编译可能对你有用。如果我没记错的话,我想在某些时候我通过在代码中添加函数来打印运行时统计信息来解决它。统计数据本身运行良好,只是调试器的链接似乎有问题。【参考方案2】:首先要做的是确定问题是在调试器插件中(我不确定这是哪个)还是在构建中。为此,请在 tasks.c 内的 xTaskIncrementTick() 中放置一个断点,然后查看 pxCurrentTCB 变量,它是一个指向 TCB 结构的指针。如果启用了运行时统计,那么应该有一个名为 ulRunTimeCounter 的结构成员。那个结构成员在那里吗?如果是,它是否包含一个值?即使该值是错误的,如果它存在,这似乎表明问题出在调试器插件中。
【讨论】:
感谢您的回复!该结构确实包含一个值为 0 的成员ulRunTimeCounter
(我读过但之前找不到)。所以插件似乎确实存在问题,特别是因为我的同事能够读取运行时统计信息来自嵌入式代码本身(在调试日志中)。不过,我仍然希望能找到让插件正常工作的解决方案。以上是关于如何在调试期间在 FreeRTOS 任务列表中显示运行时的主要内容,如果未能解决你的问题,请参考以下文章
STM32 KEIL C如何在RAM中调试FREERTOS?