精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

嵌入式軟件調試中的打印開關及打印等級

CHANBAEK ? 來源:嵌入式學習之路 ? 作者: 創客小巴 ? 2023-05-14 16:38 ? 次閱讀

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

看過文章的都知道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
收藏 人收藏

    評論

    相關推薦

    嵌入式開發習慣和嵌入式gdb調試步驟

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

    嵌入式系統軟件開發環境調試器的設計

    調試軟件開發流程是一個比較重要的環節,調試器是衡量一個軟件開發環境優劣的重要因素.本文對嵌入式
    發表于 05-30 13:51 ?29次下載

    嵌入式系統Internet打印的設計與實現

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

    基于嵌入式Linux的B超圖像打印的實現

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

    基于嵌入式Linux的打印控制系統的設計

    本文介紹了一種基于嵌入式Linux 的打印控制系統,并給出了軟、硬件的整體設計方案。這一方案應用先進的ARM 嵌入式技術,使當前必須由計算機來驅動的打印機,完全脫離了計算
    發表于 08-28 09:36 ?22次下載

    基于開源軟件嵌入式網絡打印服務器

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

    嵌入式應用的能耗調試技術

    嵌入式應用的能耗調試技術
    發表于 02-12 17:28 ?891次閱讀
    <b class='flag-5'>嵌入式</b>應用<b class='flag-5'>中</b>的能耗<b class='flag-5'>調試</b>技術

    嵌入式軟件打印調試信息的方法

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

    嵌入式軟件的開發流程_嵌入式軟件調試

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

    嵌入式arm usb打印機完整教程

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

    嵌入式開發實用的宏打印函數

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

    嵌入式開發putty串口打印亂碼

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

    單片機沒有串口時如何打印調試信息

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

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

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

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

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