电子说
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 实现了单独调试不同内核对象的效果。
全部0条评论
快来发表一下你的评论吧 !