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