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 實現了單獨調試不同內核對象的效果。
-
RT-Thread
+關注
關注
31文章
1296瀏覽量
40250
發布評論請先 登錄
相關推薦
評論