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

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

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

硬件簡單的日志打印方法

科技綠洲 ? 來源:zsky ? 作者:zsky ? 2023-06-22 10:08 ? 次閱讀

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

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

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

目的:

1)方便查找打印日志

2)日志格式規(guī)范

3)可以查看用戶添加信息,文件信息,函數(shù)接口,以及文件所在行號(hào)

4)支持format格式

5)可以支持實(shí)時(shí)時(shí)間

基本知識(shí):

C語言中的__FILE__、LINE__和__FUNCTION

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

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

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

注:

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

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

源碼

#define DEBUG_EN (1u)
 
#if (DEBUG_EN)
 
#define DEBUG_MAX_SIZE 512
extern char szBuf[DEBUG_MAX_SIZE];
 
#define DEBUG_INFO( format, ... ) do{\\
    u16 unLen = 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)
 
#define DEBUG_WARN( format, ... ) do{\\
    u16 unLen = 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)
 
#define DEBUG_ERR( format, ... ) do{\\
    u16 unLen = 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 
 
#define DEBUG_INFO(...)
#define DEBUG_WARN(...)
#define DEBUG_ERR(...)
 
#endif

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

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

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

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

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

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

圖片

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

    關(guān)注

    11

    文章

    3113

    瀏覽量

    65851
  • 嵌入式軟件
    +關(guān)注

    關(guān)注

    4

    文章

    238

    瀏覽量

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

    關(guān)注

    0

    文章

    129

    瀏覽量

    10593
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Labview實(shí)現(xiàn)txt文本文件打印簡單方法

    新手學(xué)NI,為現(xiàn)場做了一個(gè)自動(dòng)記錄到txt的小程序,但要求記錄到一定量時(shí)打印該txt文件,網(wǎng)上只有打印VI和打印EXCEL的一些教程,打電話需求NI官方的幫助,得到的解決方法是轉(zhuǎn)化為W
    發(fā)表于 03-19 13:11

    Python日志打印重復(fù)解決方法

    Python日志打印重復(fù)問題
    發(fā)表于 06-12 07:18

    簡單記錄下最近設(shè)計(jì)的一種日志打印方法

    仿真,這樣大多數(shù)方法便是加打印信息進(jìn)行找問題。打印的接口有很多種,比如串口,網(wǎng)絡(luò),顯示等等。簡單硬件開發(fā)串口估計(jì)是最常用的。這里
    發(fā)表于 01-11 06:09

    STM32的常規(guī)打印方法

    常規(guī)打印方法 在STM32的應(yīng)用中,我們常常對(duì)printf進(jìn)行重定向的方式來把打印信息printf到我們的串口助手。在...
    發(fā)表于 02-21 06:51

    講講調(diào)試程序的重要方法打印日志

    今天來講講調(diào)試程序的重要方法打印日志。無論開發(fā)何種程序,單片機(jī),手機(jī)APP,電腦客戶端,還是服務(wù)器,日志都是最基礎(chǔ)也是最重要的調(diào)試手段。手機(jī)APP,電腦客戶端和服務(wù)器的開發(fā)環(huán)境往往提
    發(fā)表于 06-20 17:14

    數(shù)碼印像機(jī)打印方

    數(shù)碼印像機(jī)打印方式              打印方式實(shí)際上就是指數(shù)碼印像機(jī)是采用何種打印技術(shù)進(jìn)行
    發(fā)表于 12-23 14:33 ?802次閱讀

    條碼打印機(jī)的打印方

    條碼打印機(jī)的打印方式         
    發(fā)表于 12-30 11:44 ?1430次閱讀

    票據(jù)打印機(jī)的打印方

    票據(jù)打印機(jī)的打印方式              票據(jù)打印機(jī)是根據(jù)打印機(jī)的主要用途劃分
    發(fā)表于 12-30 13:37 ?1131次閱讀

    票據(jù)打印機(jī)的打印方

    票據(jù)打印機(jī)的打印方向              打印方向指的是票據(jù)打印機(jī)在
    發(fā)表于 12-30 13:55 ?987次閱讀

    考勤/收費(fèi)機(jī)的打印方

    考勤/收費(fèi)機(jī)的打印方式              就是通常我們所說的根據(jù)打印的原理來劃分出來的針式打印、噴墨
    發(fā)表于 12-30 15:19 ?707次閱讀

    視頻打印機(jī)的打印方

    視頻打印機(jī)的打印方式              打印方式指的是產(chǎn)品采用的是哪種打印
    發(fā)表于 12-31 10:21 ?1226次閱讀

    基于熱敏打印機(jī)的心電圖形快速打印方法的研究及應(yīng)用實(shí)例

    基于熱敏打印機(jī)的心電圖形快速打印方法的研究及應(yīng)用實(shí)例  目前,我國各醫(yī)院普遍使用的心電圖機(jī)絕大多數(shù)是機(jī)電式的,即通過電極檢測心電信號(hào),放大后直接記錄
    發(fā)表于 02-04 09:57 ?1150次閱讀
    基于熱敏<b class='flag-5'>打印</b>機(jī)的心電圖形快速<b class='flag-5'>打印方法</b>的研究及應(yīng)用實(shí)例

    熱敏打印機(jī)的心電圖形快速打印方法

    12導(dǎo)同步心電圖機(jī)為例,介紹以普通52單片機(jī)為主控芯片應(yīng)用串行熱敏打印機(jī)實(shí)現(xiàn)多種方式的心電圖形打印,并重點(diǎn)描述了12導(dǎo)聯(lián)同步打印方式的程序?qū)崿F(xiàn)方案。
    發(fā)表于 12-05 10:03 ?5986次閱讀
    熱敏<b class='flag-5'>打印</b>機(jī)的心電圖形快速<b class='flag-5'>打印方法</b>

    關(guān)于一種高效printf打印方

    一種高效printf打印方
    的頭像 發(fā)表于 02-29 16:29 ?3105次閱讀
    關(guān)于一種高效printf<b class='flag-5'>打印方</b>式

    選擇 3D 醫(yī)療打印方法

    選擇 3D 醫(yī)療打印方法
    的頭像 發(fā)表于 12-29 10:02 ?762次閱讀