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