今天來分享下項目中經(jīng)常使用到的打印,應該是每個嵌入式軟件工程師在日常調試項目中都需要的必備技能(并不是什么很難或者不常見的方法,其實是今天公眾號沒啥寫的,就來簡單的分享一下,也一定有人能受益)之前有關打印也在公眾號中發(fā)過一篇文章,關于彩色打印的,有需要的小伙伴可以看下小編寫的這篇文章的介紹。
看過文章的都知道Easylogger的方便之處是在控制臺中斷打印出彩色的打印信息,并且能在軟件上設置打印的顏色、閃爍等效果,但是其在移植的時候勢必會占用一些內存空間,其帶來的好處也是不言而喻的,我現(xiàn)在在項目中也會使用Easylogger,能夠一眼在多如牛毛的打印信息中看到紅色的錯誤信息,有利于定位錯誤代碼。
今天要說的就是怎么在占用更小的內存空間,控制打印信息的輸出,實現(xiàn)打印的開關控制以及過濾打印等級較低的打印信息輸出。 雖然不能實現(xiàn)不同顏色的打印,但帶來的好處是在片內空間比較緊張的情況下,簡單的實現(xiàn)過濾打印信息的效果,兩種方法根據(jù)自己的硬件環(huán)境做評估。
打印開關
我們在項目中調試的代碼都有Debug版本和Release版本,Debug版本用于輸出一些log方便日常調試以及bug定位,但是打印信息影響整個系統(tǒng)的性能,因此在發(fā)布Release版本的時候一般都會要求把log信息關閉,如果要一行一行的去注釋所有的打印信息,項目代碼比較龐大的時候,似乎這個操作會累S個人,怎么才能實現(xiàn)更簡單的控制呢?
方法還是有的,使用一個宏定義,如下:
#define __DEBUG
#ifdef __DEBUG
#define DEBUG(msg) printf(msg)
#else
#define DEBUG(msg)
#endif
當定義宏__DEBUGDE時候就能打開打印信息,屏蔽__DEBUG宏定義的時候就能關閉打印信息輸出,這樣操作后就變得很簡單了。
是上面的代碼有個問題,不知道細心的小伙伴能不能發(fā)現(xiàn)。問題在于這個DEBUG宏如果用來打印可變參數(shù)似乎編譯不過去,會有錯誤產生,例如下面的代碼:
DEBUG("Hello %s\\n", "linux"); /* 此代碼結合上面的打印無法編譯通過 */
因此還需要對其進行改造。 改造后如下:
#define __DEBUG
#ifdef __DEBUG
#define DEBUG(msg, ...) printf(msg, ##__VA_ARGS__)
#else
#define DEBUG(msg, ...)
#endif
這里可以很好的解決上述問題,支持可變參數(shù)打印,__VA_ARGS__這個宏會獲取可變參數(shù)的個數(shù)
這里有一個要注意的是,在C99的標準下,上述代碼還可以優(yōu)化一下,變得稍微簡單點,如下:
#define __DEBUG
#ifdef __DEBUG
#define DEBUG(...) printf(__VA_ARGS__)
#else
#define DEBUG(...)
#endif
對比兩個代碼段,發(fā)現(xiàn)DEBUG少了參數(shù)msg,實現(xiàn)的效果也是一樣的,注意的是C99標準哦!
打印等級
打印開關了,接著來看下打印等級吧。
分等級的打印能打印出等級較高的內容,過濾一些無關的打印。 這是其優(yōu)點。
我在示例代碼中分了三個打印等級,并定義了PRINT_LEVEL,只有打印等級大于PRINT_LEVEL的才會被打印出來,那就直接看代碼。(寫法千千萬,按照自己喜歡的風格去實現(xiàn)這個功能就好,這里只是一種思路)
#if#include
#define __DEBUG /* 打印開關控制 */
#ifdef __DEBUG
#define DEBUG(...) printf(__VA_ARGS__)
#else
#define DEBUG(...)
#endif
/* 數(shù)值越大,等級越高 */
#define INFO_LEVEL 1 /* 打印等級最低 */
#define WARN_LEVEL 2 /* 打印等級2 */
#define ERROR_LEVEL 3 /* 打印等級3 */
#define DEBUG_NULL 255 /* printf off */
#define PRINT_LEVEL WARN_LEVEL /* 打印等級大于或等于WARN_LEVEL的會被打印出來 */
#define DEBUG_INFO(...) do{ \\
if(INFO_LEVEL >= PRINT_LEVEL) \\
DEBUG(__VA_ARGS__); \\
}while(0)
#define DEBUG_WARN(...) do{ \\
if(WARN_LEVEL >= PRINT_LEVEL) \\
DEBUG(__VA_ARGS__); \\
}while(0)
#define DEBUG_ERR(...) do{ \\
if(ERROR_LEVEL >= PRINT_LEVEL) \\
DEBUG(__VA_ARGS__); \\
}while(0)
int main(void)
{
DEBUG_INFO("Debug_Info msg.\\r\\n");
DEBUG_WARN("Debug_Warning msg.\\r\\n");
DEBUG_ERR("Debug_Error msg.\\r\\n");
return 0;
}
上面的代碼運行結果是:
Debug_Warning msg.
Debug_Error msg.
可以看出過濾掉了Info的打印信息,當我們只需要看錯誤信息的時候,就可以修改打印等級去實現(xiàn),這樣能更好的查看各種打印信息。
好了,到此就結束了,今天的分享還是很簡單易懂的,哪怕是在51平臺上也能簡單實現(xiàn)打印的過濾(常用的89C51 89C52上再去移植Easylogger跑起來彩色打印,應該是有點困難的,內部資源不夠,因此,簡單的實現(xiàn)log過濾就要依賴今天分享的這種方式啦)
-
開關
+關注
關注
19文章
3136瀏覽量
93600 -
嵌入式
+關注
關注
5082文章
19106瀏覽量
304829 -
軟件
+關注
關注
69文章
4923瀏覽量
87403 -
調試
+關注
關注
7文章
578瀏覽量
33924 -
DEBUG
+關注
關注
3文章
93瀏覽量
19907
發(fā)布評論請先 登錄
相關推薦
評論