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

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

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

串口日志輸出DEBUG文件編寫

技術(shù)讓夢想更偉大 ? 來源:CSDN-沉默的小宇宙 ? 2023-09-21 09:21 ? 次閱讀


相信大多數(shù)嵌入式開發(fā)者都會碰到對程序進(jìn)行調(diào)試或者查找BUG的情況,常見的兩種方法都是仿真和通過日志進(jìn)行的。

有條件仿真的是更好,單是在編寫嵌入式軟件程序過程中,并不是所有的硬件都支持仿真或者方便仿真,這樣大多數(shù)方法便是加打印信息進(jìn)行找問題。

打印的接口有很多種,比如串口,網(wǎng)絡(luò),顯示等等。簡單的硬件開發(fā)串口估計是最常用的。這里簡單記錄下一種日志打印方法。

目的:

1)方便查找打印日志 2)日志格式規(guī)范 3)可以查看用戶添加信息,文件信息,函數(shù)接口,以及文件所在行號 4)支持format格式 5)可以支持實(shí)時時間

基本知識:

C語言中的__FILE__、LINE__和__FUNCTION

1、FILE用于指示本行代碼所在源文件的文件名;

2、__LINE__用于指示本行代碼所在源文件中的位置(行數(shù));

3、__FUNCTION__用于指示本行代碼所在函數(shù)(函數(shù)名);

注:

1)"FILE"、"LINE"、"FUNCTION"等均大小寫敏感

2)支持需要添加頭文件#include

源碼

#defineDEBUG_EN(1u)

#if(DEBUG_EN)

#defineDEBUG_MAX_SIZE512
externcharszBuf[DEBUG_MAX_SIZE];

#defineDEBUG_INFO(format,...)do{
u16unLen=0;
unLen+=snprintf(szBuf+unLen,DEBUG_MAX_SIZE,"[INFO][%s][@%s][#%d]:",__FILE__,__FUNCTION__,__LINE__);
unLen+=snprintf(szBuf+unLen,DEBUG_MAX_SIZE-unLen,format,##__VA_ARGS__);
usart1_send_buf_with_txe((u8*)szBuf,unLen);
}while(0)

#defineDEBUG_WARN(format,...)do{
u16unLen=0;
unLen+=snprintf(szBuf+unLen,DEBUG_MAX_SIZE,"[WARN][%s][@%s][#%d]:",__FILE__,__FUNCTION__,__LINE__);
unLen+=snprintf(szBuf+unLen,DEBUG_MAX_SIZE-unLen,format,##__VA_ARGS__);
usart1_send_buf_with_txe((u8*)szBuf,unLen);
}while(0)

#defineDEBUG_ERR(format,...)do{
u16unLen=0;
unLen+=snprintf(szBuf+unLen,DEBUG_MAX_SIZE,"[ERR][%s][@%s][#%d]:",__FILE__,__FUNCTION__,__LINE__);
unLen+=snprintf(szBuf+unLen,DEBUG_MAX_SIZE-unLen,format,##__VA_ARGS__);
usart1_send_buf_with_txe((u8*)szBuf,unLen);
}while(0)

#elif

#defineDEBUG_INFO(...)
#defineDEBUG_WARN(...)
#defineDEBUG_ERR(...)

#endif

源碼主要使用宏定義的方式,為了支持文件、行號,函數(shù)等等,不能使用單獨(dú)的函數(shù)進(jìn)行定義。具體原因可以思考下,不過多贅述。

C文件目前只有一個數(shù)組定義char szBuf[DEBUG_MAX_SIZE];。

為了兼容,INFO,WARN和ERR三個共用一個buf,聲明全局變量更主要的一個原因是使用了串口的中斷發(fā)送函數(shù)usart1_send_buf_with_txe,而不是循環(huán)發(fā)送完成再退出,這里傳輸是進(jìn)行指針傳遞的,發(fā)送使用中斷的好處就是高效率,不耽誤其他程序跑。

當(dāng)然移植的時候完全可以根據(jù)自己的接口和實(shí)現(xiàn)方式進(jìn)行更換。

實(shí)現(xiàn)效果

[INFO][..sourcemain.c][@main][#36]:testStr[111],testInt[111],testHex[0x000015BC]
[WARN][..sourcemain.c][@main][#37]:testStr[111],testInt[111],testHex[0x000015BC]
[ERR][..sourcemain.c][@main][#38]:testStr[111],testInt[111],testHex[0x000015BC]

fcc57a04-5812-11ee-939d-92fbcf53809c.png

審核編輯:湯梓紅

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

    關(guān)注

    5059

    文章

    18975

    瀏覽量

    302069
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7595

    瀏覽量

    135869
  • 串口
    +關(guān)注

    關(guān)注

    14

    文章

    1540

    瀏覽量

    76067
  • 程序
    +關(guān)注

    關(guān)注

    116

    文章

    3762

    瀏覽量

    80755
  • 日志
    +關(guān)注

    關(guān)注

    0

    文章

    138

    瀏覽量

    10626

原文標(biāo)題:好用的嵌入式設(shè)備日志輸出模塊 log.h

文章出處:【微信號:技術(shù)讓夢想更偉大,微信公眾號:技術(shù)讓夢想更偉大】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    InDTU300系列產(chǎn)品如何輸出實(shí)時日志?

    “保存配置”,提示是否重啟時,選擇不重啟。點(diǎn)擊維護(hù)~實(shí)時日志。 點(diǎn)擊開始接收,稍等幾秒會看到模塊輸出的實(shí)時日志,故障復(fù)現(xiàn)后,依次點(diǎn)擊停止接收~導(dǎo)出日志,將
    發(fā)表于 07-25 06:05

    多任務(wù)環(huán)境下串口輸出debug信息的方法是什么?

    樓主的程序是基于freeRTOS的,劃分成了幾個任務(wù)。為了方便調(diào)試,在一些地方增加了一些從串口輸出debug信息的代碼,同時為了方便在編譯時去掉這些代碼,我是用宏定義的方法在頭文件里面
    發(fā)表于 07-20 08:03

    串口彩色波形顯示日志助手 云控日志CloudLog.exe

    FwbConf.h中的配置信息。 5、使用之中有問題或建議可以提Issues或加QQ群857283039。 參考PlatformWindows目錄下的main.c文件,您可以了解如何輸出不同類型的日志。
    發(fā)表于 09-06 16:51

    如何編寫dll文件

    如何編寫dll文件:可以用幾種語言來實(shí)現(xiàn),如delphi編寫dll,pb編寫dll文件,java 編寫
    發(fā)表于 01-16 10:20 ?8840次閱讀

    Linux日志文件系統(tǒng)解析

    在近代歷史上,日志文件系統(tǒng)被認(rèn)為十分奇特,主要是處于研究階段。而如今,日志文件系統(tǒng)(ext3)已經(jīng)成為 Linux的缺省文件系統(tǒng)。本文向大家
    發(fā)表于 11-01 15:23 ?0次下載
    Linux<b class='flag-5'>日志</b><b class='flag-5'>文件</b>系統(tǒng)解析

    Oracle核心技術(shù)之控制文件日志文件

    控制文件日志文件是Oracle數(shù)據(jù)庫中儲存信息的重要文件??刂?b class='flag-5'>文件用來存放數(shù)據(jù)庫的名字、數(shù)據(jù)文件
    發(fā)表于 03-26 11:03 ?2次下載

    Linux系統(tǒng)日志文件中的JFS文件系統(tǒng)

    嵌入式linux中文站向大家介紹一下JFS文件系統(tǒng)。Linux系統(tǒng)日志文件中的JFS系統(tǒng), JFS 由IBM 公司開發(fā),最初出現(xiàn)在AIX 操作系統(tǒng)之上,它提供了基于日志的字節(jié)級、面向事
    發(fā)表于 05-05 14:10 ?4996次閱讀
    Linux系統(tǒng)<b class='flag-5'>日志</b><b class='flag-5'>文件</b>中的JFS<b class='flag-5'>文件</b>系統(tǒng)

    單片機(jī)對日志系統(tǒng)的設(shè)計

    為單片機(jī)設(shè)計了一套簡單的日志系統(tǒng),通過日志系統(tǒng)提供的接口可以查看設(shè)備狀態(tài),并進(jìn)行一些基本的調(diào)試。 日志系統(tǒng)通過串口輸出,所以單片機(jī)需要
    發(fā)表于 04-02 14:26 ?5345次閱讀
    單片機(jī)對<b class='flag-5'>日志</b>系統(tǒng)的設(shè)計

    文件系統(tǒng)中的日志系統(tǒng)是如何實(shí)現(xiàn)的

    日志 本文來聊聊文件系統(tǒng)中的日志系統(tǒng),來看一個簡單的日志系統(tǒng)是如何實(shí)現(xiàn)的。本文是接著前面的 xv6 系列,用到的一些前導(dǎo)知識不再說明,沒看的可以先看一下。
    的頭像 發(fā)表于 09-29 11:04 ?2158次閱讀
    <b class='flag-5'>文件</b>系統(tǒng)中的<b class='flag-5'>日志</b>系統(tǒng)是如何實(shí)現(xiàn)的

    嵌入式log打印格式輸出技巧

    :[info] main.c : init ok!例:[debug] adc.c : adc_getvalue -> 3.3v參考 Java 日志框架的輸出方式:[ 文件名]
    發(fā)表于 10-20 21:06 ?5次下載
    嵌入式log打印格式<b class='flag-5'>輸出</b>技巧

    Python寫入到日志文件完整代碼

    寫入到日志文件 上面我們說的是將日志打印到控制臺中,但是我們Python代碼寫完并且在運(yùn)行當(dāng)中后,我們就不可能這樣玩了,所以我們需要將日志保存到一個
    的頭像 發(fā)表于 10-07 11:50 ?1192次閱讀
    Python寫入到<b class='flag-5'>日志</b><b class='flag-5'>文件</b>完整代碼

    Loguru日志記錄器的安裝方式

    這個強(qiáng)大工具的基本使用方法。 Loguru 安裝方式很簡單,打開終端輸入: pip install loguru 即可完成安裝。 1.即開即用 如果你需要輸出 debug 日志到終端,可以這么做
    的頭像 發(fā)表于 10-16 11:35 ?700次閱讀
    Loguru<b class='flag-5'>日志</b>記錄器的安裝方式

    Loguru:一個能徹底解放你的日志記錄器

    這個強(qiáng)大工具的基本使用方法。 Loguru 安裝方式很簡單,打開終端輸入: pip install loguru 即可完成安裝。 1.即開即用 在Loguru中,如果你需要輸出 debug 日志到終端
    的頭像 發(fā)表于 10-30 15:01 ?1088次閱讀
    Loguru:一個能徹底解放你的<b class='flag-5'>日志</b>記錄器

    Loguru :徹底解放你的日志記錄器

    這個強(qiáng)大工具的基本使用方法。 Loguru 安裝方式很簡單,打開終端輸入: pip install loguru 即可完成安裝。 1.即開即用 如果你需要輸出 debug 日志到終端,可以這么做
    的頭像 發(fā)表于 11-01 11:01 ?1117次閱讀
    Loguru :徹底解放你的<b class='flag-5'>日志</b>記錄器

    logcat命令抓取日志方法

    -b main:抓取main緩沖區(qū)的日志; -b system:抓取system緩沖區(qū)的日志; -b crash:抓取crash緩沖區(qū)的日志; -r:每次輸出多大
    的頭像 發(fā)表于 11-23 17:31 ?1006次閱讀
    logcat命令抓取<b class='flag-5'>日志</b>方法