RT-Thread Debug分析与调整方案

电子说

1.2w人已加入

描述

RT-Thread 中可以通过 menuconfig 使能相关宏,配置和使用 debug 功能,即可向工作台输出程序运行信息,方便调试和使用。

但目前的 rt-thread(5.0.0) 关于 debug 存在 rtdebug.h 和 rtdbg.h 这两个文件;存在冗余,并且 rtdbg.h 中实现的 LOG_E , LOG_W , LOG_I , LOG_D 更优,因此考虑将 rtdebug.h 中的 RT_DEBUG_LOG 废弃,全部替换为 LOG_x

问题分析

rtdebug.h 中的 RT_DEBUG_LOG 具体实现如下:

#define RT_DEBUG_LOG(type, message)
do
{
if (type)
rt_kprintf message;
}
while (0)

调用示例如下:

RT_DEBUG_LOG(RT_DEBUG_THREAD, ("startup a thread:%s with priority:%dn",
thread->parent.name, thread->current_priority));
/* RT_DEBUG_THREAD default is 0 */

可以看出, RT_DEBUG_LOG 可以通过相关宏,实现对特定内核对象的单独使能调试。

但 rtdbg.h 中的 LOG_x 是将调试信息分为不同的等级,通过与设定的 DBG_LVL 进行比较,输出不同等级的调试信息。

可以看出 LOG_x 主要针对的是不同等级, RT_DEBUG_LOG 针对的是不同对象。那接下来要考虑的重点就是:废弃 rtdebug.h 中 RT_DEBUG_LOG 的同时,如何使用 LOG_x 保留单独调试不同内核对象的特性。

解决方案

使用以下解决方案:

#define DBG_TAG "kernel.thread"
#ifdef RT_DEBUG_THREAD
#define DBG_LVL DBG_LOG
#else
#define DBG_LVL DBG_WARNING
#endif
#include
以内核对象 thread 为例,将以上代码添加到对应的 thread.c 文件中,即可使用对应的 LOG_x,可以注意到,宏判断使用的是 #ifdef RT_DEBUG_THREAD 而不再是通过判断对应宏值为 0 还是 1,这是因为 rtdebug.h 老版本问题,现在可以通过 Kconfig 非常便捷的定义相关宏,因此修改了相应的 Kconifg 文件:

/* old version */
config RT_DEBUG_THREAD_CONFIG
    bool "Enable debugging of Thread State Changes"
    default n
config RT_DEBUG_THREAD
    int
    default 1 if RT_DEBUG_THREAD_CONFIG
/* old version */

==============================================================================
/* new version /
config RT_DEBUG_THREAD
bool "Enable debugging of Thread State Changes"
default n
/
new version */

可以看出,修改后更加的简洁明了。

并且之前使用 RT_DEBUG_LOG 的内核对象的调试信息基本都为 LOG_D 级别,于是就可以使用 LOG_D 进行替换。

需要注意,使用 LOG_x 替换 RT_DEBUG_LOG 时,要删去换行符,因为 LOG_x 已经带有换行的效果。

于是我们就通过定义相关的宏,更改了对应内核对象的调试等级,使用 LOG_x 实现了单独调试不同内核对象的效果。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分