日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

好用的嵌入式設備日志輸出模塊 log.h

來源: 責編: 時間:2023-11-07 09:14:44 272觀看
導讀相信大多數嵌入式開發(fā)者都會碰到對程序進行調試或者查找BUG的情況,常見的兩種方法都是仿真和通過日志進行的。有條件仿真的是更好,單是在編寫嵌入式軟件程序過程中,并不是所有的硬件都支持仿真或者方便仿真,這樣大多數方

相信大多數嵌入式開發(fā)者都會碰到對程序進行調試或者查找BUG的情況,常見的兩種方法都是仿真和通過日志進行的。5vT28資訊網——每日最新資訊28at.com

有條件仿真的是更好,單是在編寫嵌入式軟件程序過程中,并不是所有的硬件都支持仿真或者方便仿真,這樣大多數方法便是加打印信息進行找問題。5vT28資訊網——每日最新資訊28at.com

打印的接口有很多種,比如串口,網絡,顯示等等。簡單的硬件開發(fā)串口估計是最常用的。這里簡單記錄下一種日志打印方法。5vT28資訊網——每日最新資訊28at.com

5vT28資訊網——每日最新資訊28at.com

目的:5vT28資訊網——每日最新資訊28at.com

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

基本知識

C語言中的__FILE__、LINE__和__FUNCTION:5vT28資訊網——每日最新資訊28at.com

  • FILE 用于指示本行代碼所在源文件的文件名;
  • __LINE__用于指示本行代碼所在源文件中的位置(行數);
  • __FUNCTION__用于指示本行代碼所在函數(函數名);

注:5vT28資訊網——每日最新資訊28at.com

  • "FILE "、"LINE"、"FUNCTION"等均大小寫敏感
  • 支持需要添加頭文件#include

源碼

#define DEBUG_EN (1u) #if (DEBUG_EN) #define DEBUG_MAX_SIZE 512extern 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

5vT28資訊網——每日最新資訊28at.com

源碼主要使用宏定義的方式,為了支持文件、行號,函數等等,不能使用單獨的函數進行定義。具體原因可以思考下,不過多贅述。5vT28資訊網——每日最新資訊28at.com

C文件目前只有一個數組定義char szBuf[DEBUG_MAX_SIZE];。5vT28資訊網——每日最新資訊28at.com

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

當然移植的時候完全可以根據自己的接口和實現方式進行更換。5vT28資訊網——每日最新資訊28at.com

實現效果:

[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]

圖片圖片5vT28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-17409-0.html好用的嵌入式設備日志輸出模塊 log.h

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 使用 Python 在視頻上渲染文本

下一篇: 虛擬線程原理及性能分析

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 郸城县| 永丰县| 寿光市| 遂昌县| 丰原市| 织金县| 泊头市| 连州市| 宿州市| 甘孜县| 成都市| 舒兰市| 贞丰县| 军事| 建湖县| 中超| 山阳县| 黄骅市| 浑源县| 乌兰浩特市| 沁水县| 大田县| 青田县| 黄冈市| 砚山县| 上林县| 蓬安县| 大理市| 闽侯县| 尚义县| 威信县| 阳信县| 慈溪市| 旬阳县| 新安县| 潞西市| 大石桥市| 宾阳县| 报价| 随州市| 彭州市|