Debug神器 | RT-Thread發布「超輕量級「日誌組件ulog

2021-02-19 電子發燒友網
背景知識

在介紹 ulog 前,我們先來了解一些日誌的概念:

日誌的定義 :日誌會將軟體運行的狀態、過程等信息,輸出到不同的介質中(例如:文件、控制臺、顯示屏等),並進行顯示和保存。為軟體調試、維護過程中的問題提供追溯、性能分析、系統監控、故障預警等功能,同時提供參考依據。可以說,日誌的使用,幾乎佔用了軟體生命周期至少 80% 的時間。

日誌的重要性 :對於作業系統而言,由於其軟體的複雜度非常大,單步調試在一些場景下並不適合,所以日誌組件在作業系統上幾乎都是標配。完善的日誌系統也能讓作業系統的調試事半功倍。

RT-Thread 一直缺少小巧、實用的日誌組件,而 ulog 的誕生補全了這塊的短板。今天,它將作為 RT-Thread 的基礎組件被開源出來,讓我們的開發者也能用上簡潔易用的日誌系統,提高開發效率。

ulog 介紹

ulog 是一個非常簡潔、易用的 C/C++ 日誌組件,第一個字母 u 代表 μ,即微型的意思。它能做到最低 ROM<1K, RAM<0.2K 的資源佔用。ulog 不僅有小巧體積,同樣也有非常全面的功能,其設計理念參考的是另外一款 C/C++ 開源日誌庫:EasyLogger(簡稱 elog),並在功能和性能等方面做了非常多的改進。主要特性如下:

主要特性線程安全

日誌輸出被設計為是線程安全的方式,當前線程日誌輸出不會被其他線程打斷幹擾。不用再擔心像使用 rt_kprintf 那樣,多線程並發輸出日誌時,日誌顯示錯位、截斷等問題。

高可靠

日誌系統可靠性高,在 中斷 ISR 中、Hardfault 等複雜環境下依舊可用。不僅留給用戶的限制更少,還能夠保證系統在出錯場景下,記錄的日誌依舊準確、全面,成為用戶的調試利器。而這點在其他常見的日誌系統中是做不到的。

後端多樣化

ulog 可以將日誌輸出到終端、串口、網絡,文件、快閃記憶體等位置,這些地方在 ulog 裡統稱為後端。ulog 採用了前後端分離式設計,保證了日誌的後端代碼的獨立性以及可擴展性。無論什麼樣的後端,只要實現出來,都可以註冊上去。

當前 ulog 已經集成了兩種後端:

未來還將會有更多的後端加入進來,也期待大家一起參與,實現你們需要的後端,然後分享出來。

支持異步輸出

在 ulog 中,默認的輸出模式是同步模式,在很多場景下用戶可能還需要異步模式。用戶在調用日誌輸出 API 時,會將日誌緩存到緩衝區中,會有專門負責日誌輸出的線程取出日誌,然後輸出到後端。

這樣日誌輸出不會阻塞當前線程,日誌調試代碼也就不會影響當前線程運行時序。

靈活的過濾配置

以上運行階段的配置也都支持通過 Finsh/MSH 命令進行操作。

兼容 syslog

ulog 提供了 syslog 模式的支持,不僅僅前端 API 與 syslog API 完全一致,日誌的格式也符合 RFC 標準,更好的兼容了來自 linux 平臺上的軟體代碼。

支持 hexdump

hexdump 也是日誌輸出時較為常用的功能,通過 hexdump 可以將一段數據以 hex 格式輸出出來。大致效果如下:

支持浮點數列印

這個一直以來都是大家用 rt_kprintf 的痛點,現在在 ulog 上得到了徹底的解決。使用前,需要先在 menuconfig 中配置開啟 ulog 的浮點數支持。

兼容 rtdbg.h 及 elog

rtdbg 是 RT-Thread 早期的日誌頭文件,當前 rtdbg 已完成 無縫對接  ulog ,開啟 ulog 後,舊項目中使用 rtdbg 的代碼無需做任何修改,即可使用 ulog 完成日誌輸出。

elog 是 EasyLogger 的簡稱,對於 elog 來說,ulog 能完全做到 API 層面的兼容。使用時,只需要將舊項目原始碼中的 #include <elog.h> 更換為 #include <ulog.h> 即可,其他代碼無需再做任何改動。

使用流程

ulog 的代碼目前開源在 RT-Thread 的  GitHub 倉庫中,代碼位於 rt-thread/components/utilities/ulog 下,大致使用流程如下:

#define LOG_TAG      "example"     //定義當前文件的日誌標籤,不定義默認為:`NO_TAG`
#define LOG_LVL      LOG_LVL_DBG   //定義當前文件的日誌輸出級別,不定義默認為:調試級別
#include <ulog.h>
/* 使用 ulog API 輸出日誌 */
LOG_D("this is a debug log!");
LOG_I("this is a info log!");
LOG_W("this is a warning log!");
LOG_E("this is a error log!");

獲取文檔

RT-Thread 為 ulog 組件提供了兩篇應用筆記,從由淺入深的角度幫助大家更好的使用該組件,文檔如下:(以下連結請複製至外部瀏覽器打開)

《RT-Thread ulog 日誌組件應用筆記 - 基礎篇》:https://www.rt-thread.org/document/site/rtthread-application-note/debug/ulog/an0022-rtthread-debug-ulog-basic/

《RT-Thread ulog 日誌組件應用筆記 - 進階篇》:https://www.rt-thread.org/document/site/rtthread-application-note/debug/ulog/an0024-rtthread-debug-ulog-advance/

RT-Thread


讓物聯網終端的開發變得簡單、快速,晶片的價值得到最大化發揮。GPLv2+協議,可免費在商業產品中使用。

相關焦點

  • RT-Thread 入門學習筆記 - 查看線程棧的地址
    _t stack_size; 仿照list_thread編寫測試代碼void dump_thread_ex(void){ rt_uint8_t index = 0; rt_uint8_t obj_size = 0; int thread_cnt = rt_object_get_length
  • 基於rt-thread功耗調優與PM管理實戰經驗分享-調試篇
    這裡使用的是rt-thread 作業系統,如果換用freertos等,可能會稍有不同。這篇開始進入功耗調試正題。前言板級準備環境搭建與調試把當前的工程編譯環境搞好,代碼編譯完下進去,看看功耗情況,幾十毫安是有的,然後開始調試代碼的編寫。
  • RT-Thread 當前最新的 nRF24L01 組件這麼用
    (NRF24_DEMO_SEND_INTERVAL);}const static struct nrf24_callback _cb = { .rx_ind = rx_ind, .tx_done = tx_done,};static void thread_entry(void *param){ nrf24_t nrf24; rt_kprintf("[
  • RT-Thread ADC設備學習筆記
    2.1 硬體原理圖參考這篇文章:基於小熊派氣體傳感器MQ-2綜合實踐2.2 軟體功能實現根據官方給出的文檔可以分為這麼幾步操作:查找設備 rt_device_t rt_device_find(const char* name);參數描述nameADC 設備名稱返回--設備句柄查找到對應設備將返回相應的設備句柄RT_NULL沒有找到設備使能設備rt_err_t rt_adc_enable
  • RT-Thread 編程風格指南
    1.目錄名稱目錄名稱如果無特殊的需求,請使用全小寫的形式;目錄名稱應能夠反應部分的意思,例 如各晶片移植由其晶片名稱構成或晶片類別構成;components 目錄下能夠反映組件的意義。2.文件名稱文件名稱如果無特殊的需求(如果是引用其他地方,可以保留相應的名稱),請使用全小寫 的形式。另外為了避免文件名重名的問題,一些地方請儘量不要使用通用化、使用頻率高 的名稱。
  • 是的,RT-Thread 3.0.3發布了
    春節過完,眨眼間2018年已經來到3月份,在3月的春光裡,RT-Thread也恢復到正常工作狀態,除了正在擴大陣容求才,還有在春節延誤的新版本( RT-Thread 3.0.3)更新發布現在也一併補上
  • RT-Thread MicroPython IDE 正式版發布
    現在我們認為,是時候發布正式版本了。我們希望能給更多的 MicroPython 開發者帶來便利,也希望各位開發者能多多向我們反饋意見,這樣我們才能繼續迭代開發,給大家帶來更好的使用體驗。接下來讓我來向大家介紹一下本次發布的正式版中有哪些重要特性吧:
  • Linux系統下ESP32開發板搭建RT-Thread開發環境
    獲取代碼cd ~git clonehttps://github.com/BernardXiong/rtthread-esp-idf cd rtthread-esp-idfgit submodule initgit submodule update cd esp-idf-port/
  • RT-Thread Smart上手指南~
    4CC build/kernel/src/thread.o 5CC build/kernel/src/timer.o 6LINK rtthread.elf 7arm-linux-musleabi-objcopy -O binary rtthread.elf rtthread.bin 8arm-linux-musleabi-size rtthread.elf
  • RT-Thread Smart 上手指南
    4CC build/kernel/src/thread.o 5CC build/kernel/src/timer.o 6LINK rtthread.elf 7arm-linux-musleabi-objcopy -O binary rtthread.elf rtthread.bin 8arm-linux-musleabi-size rtthread.elf
  • RT-Thread Nano如何適配pin設備API,並在RT-Thread Nano使用軟體包
    BearPI-IOT board為什麼需要設備接口RT-Thread 分為標準版本和 Nano 版本,其特點如下:RT-Thread 標準版:擁有設備驅動框架,軟體包等組件,軟體包都是基於設備驅動接口來實現。RT-Thread Nano:僅僅只是一個 RTOS 內核。沒有任何組件。Nano 是無法直接使用 RT-Thread 豐富軟體包功能。
  • RT-Thread Nano如何適配Pin設備API,並在RT-Thread Nano使用軟體包
    BearPI-IOT board為什麼需要設備接口RT-Thread 分為標準版本和 Nano 版本,其特點如下:RT-Thread 標準版:擁有設備驅動框架,軟體包等組件,軟體包都是基於設備驅動接口來實現。RT-Thread Nano:僅僅只是一個 RTOS 內核。沒有任何組件。Nano 是無法直接使用 RT-Thread 豐富軟體包功能。
  • RT-Thread Nano實戰2-msh配置與運行
    uart主要用到了RT-Thread的device驅動組件和ringbuffer組件。和RT-Thread標準版bsp下的serial驅動有一些區別,具體可參照第5部分.相關閱讀RT-Thread常使用rt_hw_usart_init()函數,也可自定義函數名。
  • 當「樹莓派」遇上RT-Thread Smart——應用編程入門
    我們從現在開始會逐步連載RT-Thread Smart(簡稱rt-smart,甚至有時會稱為smart os)的介紹文章,旨在讓大家認識,接觸到smart os
  • RT-Thread教程一之Linux下開發環境及QEMU配置
    RT-Thread原始碼Linux下安裝git後在工程目錄下(比~/Workplace)執行git clone https://github.com/RT-Thread/rt-thread 我們看一下樹目錄結構➜  rt-thread git:(master) ✗ tree . -L 1.
  • µC/OS、FreeRTOS、RT-Thread、ThreadX開源協議的具體內容
    關注+星標公眾號,不錯過精彩內容作者 | strongerHuang微信公眾號 | 嵌入式專欄選擇RTOS,通常會考慮開源、市場佔有率、配套資料和例程,以及配套組件等µC及相關組件以允許的開源Apache 2.0許可模式提供,在這種開源模型下,尋求使用組件的開發人員可以免費下載和使用該軟體。https://weston-embedded.com/micrium-licensingApache 協議在為開發人員提供版權及專利許可的同時,允許用戶擁有修改代碼及再發布的自由。
  • RT-Thread Studio開發環境搭建
    從今天開始,我們學習使用RT-Thread Studio IDE開發STM32程序,RT-Thread Studio是一站式的 RT-Thread 開發工具,通過簡單易用的圖形化配置系統以及豐富的軟體包和組件資源
  • 基於RT-Thread的雷射雷達避障小車
    投稿:andychen@rt-thread.com背景描述由於在學校裡很少有機會讓我將所學的東西付諸於實踐.有時候學完一個東西沒法真正了解自己是否掌握,同時為了進一步提高自己的能力,不再漫無目的的學習.所以決定做這樣一輛小車.其中PCB原理圖和初版PCB_layout是我在寒假在家中完成的,程序是基於rt-thread[BSP]stm32f429-Apollo
  • 【RT-Thread Studio入門】使用輪詢法檢測按鍵
    = RT_NULL) 3    rt_err = rt_thread_startup(key_thread); 4else 5    rt_kprintf("key thread create failure !!!
  • 如何向RT-Thread提交一個BSP?
    二、RT-Thread遵循的許可協議RT-Thread的開源協議是進行過調整的,在2018年RT-Thread官方公眾號發布的一篇文章[1]中,我們可以知道當時是使用的GPLv2協議。rt-thread所遵循的開源協議在貢獻代碼之前,我們有必要先來了解一下開源項目所遵循的協議,如果你提交成功,開源協議將會約束這些代碼被如何使用。