0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

嵌入式軟件調(diào)試中的打印開關(guān)及打印等級

CHANBAEK ? 來源:嵌入式學(xué)習(xí)之路 ? 作者: 創(chuàng)客小巴 ? 2023-05-14 16:38 ? 次閱讀

今天來分享下項目中經(jīng)常使用到的打印,應(yīng)該是每個嵌入式軟件工程師在日常調(diào)試項目中都需要的必備技能(并不是什么很難或者不常見的方法,其實是今天公眾號沒啥寫的,就來簡單的分享一下,也一定有人能受益)之前有關(guān)打印也在公眾號中發(fā)過一篇文章,關(guān)于彩色打印的,有需要的小伙伴可以看下小編寫的這篇文章的介紹。

看過文章的都知道Easylogger的方便之處是在控制臺中斷打印出彩色的打印信息,并且能在軟件上設(shè)置打印的顏色、閃爍等效果,但是其在移植的時候勢必會占用一些內(nèi)存空間,其帶來的好處也是不言而喻的,我現(xiàn)在在項目中也會使用Easylogger,能夠一眼在多如牛毛的打印信息中看到紅色的錯誤信息,有利于定位錯誤代碼。

今天要說的就是怎么在占用更小的內(nèi)存空間,控制打印信息的輸出,實現(xiàn)打印的開關(guān)控制以及過濾打印等級較低的打印信息輸出。 雖然不能實現(xiàn)不同顏色的打印,但帶來的好處是在片內(nèi)空間比較緊張的情況下,簡單的實現(xiàn)過濾打印信息的效果,兩種方法根據(jù)自己的硬件環(huán)境做評估。

打印開關(guān)

我們在項目中調(diào)試的代碼都有Debug版本和Release版本,Debug版本用于輸出一些log方便日常調(diào)試以及bug定位,但是打印信息影響整個系統(tǒng)的性能,因此在發(fā)布Release版本的時候一般都會要求把log信息關(guān)閉,如果要一行一行的去注釋所有的打印信息,項目代碼比較龐大的時候,似乎這個操作會累S個人,怎么才能實現(xiàn)更簡單的控制呢?

方法還是有的,使用一個宏定義,如下:

#define  __DEBUG


#ifdef  __DEBUG
#define  DEBUG(msg)  printf(msg)
#else
#define  DEBUG(msg)
#endif

當(dāng)定義宏__DEBUGDE時候就能打開打印信息,屏蔽__DEBUG宏定義的時候就能關(guān)閉打印信息輸出,這樣操作后就變得很簡單了。

是上面的代碼有個問題,不知道細(xì)心的小伙伴能不能發(fā)現(xiàn)。問題在于這個DEBUG宏如果用來打印可變參數(shù)似乎編譯不過去,會有錯誤產(chǎn)生,例如下面的代碼:

DEBUG("Hello %s\\n", "linux");  /* 此代碼結(jié)合上面的打印無法編譯通過 */

因此還需要對其進(jìn)行改造。 改造后如下:

#define  __DEBUG


#ifdef  __DEBUG
#define  DEBUG(msg, ...)  printf(msg, ##__VA_ARGS__)
#else
#define  DEBUG(msg, ...)
#endif

這里可以很好的解決上述問題,支持可變參數(shù)打印,__VA_ARGS__這個宏會獲取可變參數(shù)的個數(shù)

這里有一個要注意的是,在C99的標(biāo)準(zhǔn)下,上述代碼還可以優(yōu)化一下,變得稍微簡單點,如下:

#define  __DEBUG


#ifdef  __DEBUG
#define  DEBUG(...)  printf(__VA_ARGS__)
#else
#define  DEBUG(...)
#endif

對比兩個代碼段,發(fā)現(xiàn)DEBUG少了參數(shù)msg,實現(xiàn)的效果也是一樣的,注意的是C99標(biāo)準(zhǔn)哦!

打印等級

打印開關(guān)了,接著來看下打印等級吧。

分等級的打印能打印出等級較高的內(nèi)容,過濾一些無關(guān)的打印。 這是其優(yōu)點。

我在示例代碼中分了三個打印等級,并定義了PRINT_LEVEL,只有打印等級大于PRINT_LEVEL的才會被打印出來,那就直接看代碼。(寫法千千萬,按照自己喜歡的風(fēng)格去實現(xiàn)這個功能就好,這里只是一種思路)

#if#include 


#define  __DEBUG                    /* 打印開關(guān)控制 */


#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;
}

上面的代碼運行結(jié)果是:

Debug_Warning msg.


Debug_Error msg.

可以看出過濾掉了Info的打印信息,當(dāng)我們只需要看錯誤信息的時候,就可以修改打印等級去實現(xiàn),這樣能更好的查看各種打印信息。

好了,到此就結(jié)束了,今天的分享還是很簡單易懂的,哪怕是在51平臺上也能簡單實現(xiàn)打印的過濾(常用的89C51 89C52上再去移植Easylogger跑起來彩色打印,應(yīng)該是有點困難的,內(nèi)部資源不夠,因此,簡單的實現(xiàn)log過濾就要依賴今天分享的這種方式啦)

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 開關(guān)
    +關(guān)注

    關(guān)注

    19

    文章

    3113

    瀏覽量

    93348
  • 嵌入式
    +關(guān)注

    關(guān)注

    5052

    文章

    18912

    瀏覽量

    300812
  • 軟件
    +關(guān)注

    關(guān)注

    69

    文章

    4614

    瀏覽量

    86993
  • 調(diào)試
    +關(guān)注

    關(guān)注

    7

    文章

    564

    瀏覽量

    33836
  • DEBUG
    +關(guān)注

    關(guān)注

    3

    文章

    89

    瀏覽量

    19808
收藏 人收藏

    評論

    相關(guān)推薦

    嵌入式開發(fā)習(xí)慣和嵌入式gdb調(diào)試步驟

    嵌入式linux開發(fā)過程,出現(xiàn)BUG是在所難免的,這時就需要用到調(diào)試技術(shù)了,最常用、最簡單的調(diào)試方法當(dāng)屬printf打印了。 如果ubu
    發(fā)表于 12-17 23:39

    嵌入式系統(tǒng)軟件開發(fā)環(huán)境調(diào)試器的設(shè)計

    調(diào)試軟件開發(fā)流程是一個比較重要的環(huán)節(jié),調(diào)試器是衡量一個軟件開發(fā)環(huán)境優(yōu)劣的重要因素.本文對嵌入式
    發(fā)表于 05-30 13:51 ?29次下載

    嵌入式系統(tǒng)Internet打印的設(shè)計與實現(xiàn)

    本文通過設(shè)計實例介紹了一種嵌入式網(wǎng)絡(luò)打印的實現(xiàn)方案。該方案選用ATmega128 為MPU、LAN91C111 為網(wǎng)絡(luò)控制器,以通用的SPP 打印并口作為物理輸出端 口,硬件構(gòu)成上具有典型意義。軟
    發(fā)表于 06-23 13:40 ?20次下載

    基于嵌入式Linux的B超圖像打印的實現(xiàn)

    本文實現(xiàn)了一種基于嵌入式Linux 的B 超圖像打印方案,可以在多種常用噴墨打印機(jī)上輸出256 灰度級的超聲圖像硬拷貝。通過對個人計算機(jī)Linux 下的打印系統(tǒng)的分析,提出了符合
    發(fā)表于 08-22 11:24 ?16次下載

    基于嵌入式Linux的打印控制系統(tǒng)的設(shè)計

    本文介紹了一種基于嵌入式Linux 的打印控制系統(tǒng),并給出了軟、硬件的整體設(shè)計方案。這一方案應(yīng)用先進(jìn)的ARM 嵌入式技術(shù),使當(dāng)前必須由計算機(jī)來驅(qū)動的打印機(jī),完全脫離了計算
    發(fā)表于 08-28 09:36 ?22次下載

    基于開源軟件嵌入式網(wǎng)絡(luò)打印服務(wù)器

    基于開源軟件嵌入式網(wǎng)絡(luò)打印服務(wù)器   引 言   目前常用的打印機(jī)有兩種接口形式:USB口和Eth-ernet網(wǎng)口。由于價格相對較低,USB口的
    發(fā)表于 11-27 09:57 ?2075次閱讀
    基于開源<b class='flag-5'>軟件</b>的<b class='flag-5'>嵌入式</b>網(wǎng)絡(luò)<b class='flag-5'>打印</b>服務(wù)器

    嵌入式應(yīng)用的能耗調(diào)試技術(shù)

    嵌入式應(yīng)用的能耗調(diào)試技術(shù)
    發(fā)表于 02-12 17:28 ?873次閱讀
    <b class='flag-5'>嵌入式</b>應(yīng)用<b class='flag-5'>中</b>的能耗<b class='flag-5'>調(diào)試</b>技術(shù)

    嵌入式軟件打印調(diào)試信息的方法

    在我們的嵌入式開發(fā),常常把printf重定向到MCU的串口外設(shè),再配合上位機(jī)界面軟件,通過打印調(diào)試信息的方式來
    的頭像 發(fā)表于 04-04 17:35 ?3216次閱讀

    嵌入式軟件的開發(fā)流程_嵌入式軟件調(diào)試

    本文首先介紹了嵌入式軟件的發(fā)展,其次闡述了嵌入式軟件的開發(fā)流程,最后介紹了嵌入式軟件
    發(fā)表于 08-31 16:02 ?6193次閱讀

    嵌入式arm usb打印機(jī)完整教程

    嵌入式arm usb打印機(jī)完整教程(嵌入式開發(fā)實習(xí)手冊)-該文檔為嵌入式arm usb打印機(jī)完整教程文檔,是一份很不錯的參考資料,具有較高參
    發(fā)表于 08-04 09:54 ?32次下載
    <b class='flag-5'>嵌入式</b>arm usb<b class='flag-5'>打印</b>機(jī)完整教程

    嵌入式開發(fā)實用的宏打印函數(shù)

    打印函數(shù)在我們的嵌入式開發(fā),使用printf打印一些信息是一種常用的調(diào)試手段。但是,在打印
    的頭像 發(fā)表于 09-16 10:05 ?1591次閱讀
    <b class='flag-5'>嵌入式</b>開發(fā)<b class='flag-5'>中</b>實用的宏<b class='flag-5'>打印</b>函數(shù)

    嵌入式開發(fā)putty串口打印亂碼

    目錄嵌入式開發(fā)putty串口打印亂碼編碼格式問題波特率設(shè)置錯誤嵌入式開發(fā)putty串口打印亂碼在使用putty連接串口打印的時候,發(fā)現(xiàn)
    發(fā)表于 11-02 18:21 ?12次下載
    <b class='flag-5'>嵌入式</b>開發(fā)putty串口<b class='flag-5'>打印</b>亂碼

    單片機(jī)沒有串口時如何打印調(diào)試信息

    輸出調(diào)試信息是嵌入式開發(fā)必不可少的調(diào)試利器,嵌入式開發(fā)的一個特點是很多時候沒有操作系統(tǒng),或者沒有文件系統(tǒng),常規(guī)的
    的頭像 發(fā)表于 03-10 17:19 ?2533次閱讀
    單片機(jī)沒有串口時如何<b class='flag-5'>打印</b><b class='flag-5'>調(diào)試</b>信息

    如何選擇(集成)嵌入式熱敏打印機(jī)

    各種自助終端機(jī)在集成嵌入式熱敏打印機(jī)時候應(yīng)該考慮和關(guān)注哪些因素和技術(shù)點
    的頭像 發(fā)表于 08-02 11:07 ?1708次閱讀
    如何選擇(集成)<b class='flag-5'>嵌入式</b>熱敏<b class='flag-5'>打印</b>機(jī)

    (集成)嵌入式熱敏打印機(jī)的選擇

    各種自助終端機(jī)在集成嵌入式熱敏打印機(jī)時候應(yīng)該考慮哪些因素,關(guān)注哪些技術(shù)點?選擇比較適合的嵌入式熱敏打印機(jī)。
    發(fā)表于 08-09 15:53 ?3次下載