国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

RT-Thread ULOG: 創建多個文件后端并保存不同日志方法 | 技術集結

RT-Thread官方賬號 ? 2025-12-15 19:22 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

目錄

前言


使用場景


實現功能


具體操作

1 前言

在項目開發中需要使用到日志功能來調試和查看問題。有些問題并不會在我們實時查看的時候發生,而是在你上個廁所的功夫可能就發生了。如果上位機的緩沖區不夠大,可能錯誤日志都看不到。

這時候就很有必要把日志文件保存在文件系統中了。RTT軟件包中ULOG_FILE這個包可以實現日志文件的保存,但是它兩年沒更新了,另一個是會把所有日志保存起來。并不能按不同的標簽分開保存。

還好現在的ulog組件自帶了文件后端,只需要我們去配置就好了。

2 使用場景

在實際應用中,有些日志信息需要不間斷輸出并保存。例如AGV的運動信息,電池電量等等。

這些信息如果不作處理,會一并打印在控制臺上,影響查看重要信息與輸入MSH命令

3 實現功能

所以需要一個文件來實現:

1.日志分開保存在不同文件內。

2.控制臺可以按需求顯示與不顯示某類信息。

4 具體操作

0.前提配置

1.ULOG組件勾選并使用異步模式。

2.使用一個文件系統來保存文件

3.ULOG組件勾選文件后端

53fefcc8-d9a8-11f0-8ce9-92fbcf53809c.png

4.先確保文件系統能夠正常讀寫,創建,刪除

1.新建一個注冊表,把目錄,文件名,大小,數量寫入表內

BUFF_SIZE這個緩沖區代表多少大小再進行一次寫入,緩沖區太大,會很久才更改一次。

BUFF_SIZE太小會寫入太頻繁,導致ULOG異步線程堆棧不夠溢出

ROOT_PATH是保存的路徑。我選擇“/flash/log”是因為我使用了ROM系統保存根目錄,根目錄是只讀的。只有/flash下的文件夾才是可讀寫的。

上下左右滑動閱覽

struct_log_file{constchar*name;constchar*dir_path;rt_size_tmax_num;rt_size_tmax_size;rt_size_tbuf_size;};#defineROOT_PATH"/flash/log"#defineFILE_SIZE 512 * 1024#defineBUFF_SIZE 512staticstruct_log_filetable[] ={{"sys" ,ROOT_PATH,10,FILE_SIZE,BUFF_SIZE},{"motion" ,ROOT_PATH,5,FILE_SIZE,BUFF_SIZE},};

2.進行文件后端初始化

注意init后一定要enbale,不然沒有運行

上下左右滑動閱覽

staticstructulog_backendsys_log_backend;staticstructulog_file_besys_log_file;voidsys_log_file_backend_init(void){ structulog_file_be *file_be = &sys_log_file; uint8_tid= sys_id; file_be->parent = sys_log_backend; ulog_backend_filter_tfilter= sys_log_file_backend_filter; ulog_file_backend_init( file_be, table[id].name, table[id].dir_path, table[id].max_num, table[id].max_size, table[id].buf_size); ulog_file_backend_enable(file_be);}staticstructulog_backendmotion_log_backend;staticstructulog_file_bemotion_log_file;voidmotion_log_file_backend_init(void){ structulog_file_be *file_be = &motion_log_file; uint8_tid= motion_id; file_be->parent = motion_log_backend; ulog_backend_filter_tfilter= motion_log_file_backend_filter; ulog_file_backend_init( file_be, table[id].name, table[id].dir_path, table[id].max_num, table[id].max_size, table[id].buf_size); ulog_file_backend_enable(file_be);}

3.測試運行

這個時候就可以先測試一下,看看日志有沒有都保存在兩個文件內

后綴名都是.log

540dde5a-d9a8-11f0-8ce9-92fbcf53809c.png

使用cat命令查看一下內容

54197f62-d9a8-11f0-8ce9-92fbcf53809c.png

4.分開保存不同日志

上一步只進行了同時保存在兩個文件內。還需要保存不同的日志內容。

1.在初始化函數中加入濾波函數設置

上下左右滑動閱覽

voidsys_log_file_backend_init(void){ ulog_backend_filter_t filter = sys_log_file_backend_filter; ulog_backend_set_filter(&file_be->parent,filter);}

2.編寫濾波函數

這個函數是自己編寫的,比如系統日志文件不需要標簽帶有”MOVE”的

上下左右滑動閱覽

#defineMOTION_TAG "MOVE"staticrt_bool_tsys_log_file_backend_filter(structulog_backend *backend,rt_uint32_tlevel, constchar *tag,rt_bool_tis_raw, constchar *log,rt_size_tlen){ if(rt_strncmp(tag,MOTION_TAG,sizeof(MOTION_TAG)) ==0)//排除帶有"MOVE"標簽輸出 returnRT_FALSE; else returnRT_TRUE;}

比如運動日志文件只需要標簽帶有”MOVE”的

上下左右滑動閱覽

staticrt_bool_tmotion_log_file_backend_filter(structulog_backend *backend,rt_uint32_tlevel, constchar *tag,rt_bool_tis_raw, constchar *log,rt_size_tlen){ if(rt_strncmp(tag,MOTION_TAG,sizeof(MOTION_TAG)) ==0)//帶有"MOVE"標簽輸出 returnRT_TRUE; else returnRT_FALSE;}

3.在一個線程中使用帶特定標簽的日志輸出看一下效果

上下左右滑動閱覽

#define LOG_MV(...) ulog_i(MOTION_TAG, __VA_ARGS__)while(1){ set_angle +=0.1; get_angle -=0.1; set_speed +=1; get_speed -=1; vaule +=3.14; LOG_MV("%f%f%d%f%f", set_angle,get_angle,set_speed, get_speed,vaule); rt_thread_mdelay(500);}

大小不同的保存文件

54244fe6-d9a8-11f0-8ce9-92fbcf53809c.png

一個是系統日志

542fd83e-d9a8-11f0-8ce9-92fbcf53809c.png

一個是運動日志

543cb18a-d9a8-11f0-8ce9-92fbcf53809c.png

內容也不同,搞定完成

5.實現文件后端輸出功能的關閉與打開

像易掉電的嵌入式使用FLASH或者EEPROM,容易在進行文件操作時掉電,導致文件損壞。另一個就是文件打開狀態下,是不能刪除的。有的時候又需要清除無用的日志文件。這就需要實現可以對文件后端進行控制

1.控制日志是否輸出到文件中

上下左右滑動閱覽

staticvoidlog_file_backend_control(uint8_t argc, char**argv){ constchar*operator=argv[1]; constchar*flag=argv[2]; if(argc

2.控制日志文件后端卸載,來刪除文件

上下左右滑動閱覽

staticvoidlog_file_backend_deinit(uint8_t argc, char**argv){ constchar*operator=argv[1]; if(argc

6.擴展功能,顯示與不顯示特定日志到控制臺上

按照上面操作下來,基本功能都完成了。還差一個控制臺可以按需求顯示與不顯示某類信息。

不實現這個,會導致控制臺信息一直在輸出,無法查看重要信息,不好輸入命令

1.對console_be.c進行改造

增加ulog_console_backend_filter函數的弱定義,可以在其他地方進行實現

在控制臺初始化時,掛鉤ulog_console_backend_filter函數

上下左右滑動閱覽


RT_WEAKrt_bool_tulog_console_backend_filter(struct ulog_backend *backend, rt_uint32_t level, constchar *tag, rt_bool_t is_raw,constchar *log, rt_size_t len){ returnRT_TRUE;}intulog_console_backend_init(void){ ulog_init(); console.output= ulog_console_backend_output; ulog_backend_register(&console,"console",RT_TRUE); ulog_backend_set_filter(&console,ulog_console_backend_filter); return0;}INIT_PREV_EXPORT(ulog_console_backend_init);

2.實現ulog_console_backend_filter函數,過濾不需要顯示信息

上下左右滑動閱覽

rt_bool_tulog_console_backend_filter(structulog_backend *backend,rt_uint32_tlevel, constchar *tag,rt_bool_tis_raw, constchar *log,rt_size_tlen){ if(rt_strncmp(tag,MOTION_TAG,sizeof(MOTION_TAG)) ==0)//排除帶有"MOVE"標簽輸出 returnRT_FALSE; else returnRT_TRUE;}

3.增加MSH命令,用來控制控制臺需不需要查看信息

有些時候,日志文件輸出的不是實時的。打開文件查看也不方便。

能輸出到控制臺直接顯示是最合適不過

上下左右滑動閱覽

#ifdefRT_USING_MSHstaticvoidulog_console_backend_filter_set(uint8_targc,char**argv){ if(argc

7.結束

以上就是全部內容了。

這個應用根據我在github上提出的問題實現的。

https://github.com/RT-Thread/rt-thread/issues/6567

之前也有這種需求,用的是另一種方式。

https://club.rt-thread.org/ask/article/e3ace649aea0ba5c.html

稍微提一句,MSH命令的控制函數沒有使用輸入文件后端的名稱去查找實現。因為ulog_backend_find()函數的返回只有ulog的后端指針,沒有file_be的指針,沒辦法操作。覺得ulog_backend的結構體可以加一個子對象,就像ulog_file_be的結構體加入了parent一樣

特此分享^~^

最后附上代碼文件

ulog_file_be.c(https://club.rt-thread.org/file_download/d845a228140ec38b

ulog_file_be.h(https://club.rt-thread.org/file_download/ef9a1b046b884535

console_be.c(https://club.rt-thread.org/file_download/0b4e0fd7bc8a566e

【更新]

取消console_be.c的代碼

MSH命令改為使用ulog_be_cmd控制

支持控制臺操作

54491c04-d9a8-11f0-8ce9-92fbcf53809c.png

ulog_file_be.c(https://club.rt-thread.org/file_download/db82838a83e98553

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • ROM
    ROM
    +關注

    關注

    4

    文章

    579

    瀏覽量

    89067
  • RT-Thread
    +關注

    關注

    32

    文章

    1613

    瀏覽量

    44869
  • 項目開發
    +關注

    關注

    0

    文章

    9

    瀏覽量

    7498
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    RT-Thread文件系統的基本知識和使用方法

    演示 shell 命令和使用示例的方式來操作文件系統,讓開發者能夠學會 RT-Thread 文件系統的使用方法
    的頭像 發表于 08-17 10:01 ?3.3w次閱讀
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>文件</b>系統的基本知識和使用<b class='flag-5'>方法</b>

    RT-Thread Vector軟件包:嵌入式開發的動態數組容器 | 技術集結

    RT-Thread Vector軟件包:嵌入式開發的動態數組容器 | 技術集結
    的頭像 發表于 01-25 09:33 ?5375次閱讀
    <b class='flag-5'>RT-Thread</b> Vector軟件包:嵌入式開發的動態數組容器 | <b class='flag-5'>技術</b><b class='flag-5'>集結</b>

    簡潔易用的日志系統 ulog 日志

    操作系統上幾乎都是標配。完善的日志系統也能讓操作系統的調試事半功倍。ulog 的起源: RT-Thread 一直缺少小巧、實用的日志組件,而 ulo
    發表于 03-29 06:40

    如何使用RT-Thread Studio創建支持HPM6750開發板的RT-Thread項目

    如何使用RT-Thread Studio創建RT-Thread項目,如何對項目進行編譯、調試,如何將生成的二進制文件下載到開發板上,以及如何使用“串口終端”功能。
    發表于 06-08 11:22

    ULOG創建多個文件后端保存同日志方法

    命令。三、實現功能所以需要一個文件來實現:1.日志分開保存在不同文件內。2.控制臺可以按需求顯示與不顯示某類信息。具體操作0.前提配置1.ULOG
    發表于 10-31 17:40

    ulog_easyflash存滿后去讀取日志系統重啟咋辦

    MCU:stm32f407SPI flash:W25Q128IDE:rt-thread studio軟件包:ulog_easyflash+easyflasheasyflash同時開啟了ENV環境變量
    發表于 12-30 15:17

    不知道rt-threadulog為什么可以在中斷中使用?

    初學rt-thread,有點疑問,不知道rt-threadulog為什么可以在中斷中使用,ulog與fastlog的區別又在哪里呢感謝各位解答
    發表于 02-03 11:43

    RT-Thread發布“超輕量級“日志組件ulog

    ulog 可以將日志輸出到終端、串口、網絡,文件、閃存等位置,這些地方在 ulog 里統稱為后端ulo
    的頭像 發表于 11-02 09:45 ?1.8w次閱讀

    RT-Thread Studio驅動SD卡

    RT-Thread Studio驅動SD卡前言一、創建基本工程1、創建Bootloader2、創建項目工程二、配置RT-Thread Set
    發表于 12-27 19:13 ?20次下載
    <b class='flag-5'>RT-Thread</b> Studio驅動SD卡

    RT-Thread全球技術大會:螢石研發團隊使用RT-Thread技術挑戰

    RT-Thread全球技術大會:研發團隊使用RT-Thread技術挑戰 ? ? ? ? 審核編輯:彭靜
    的頭像 發表于 05-27 11:36 ?2206次閱讀
    <b class='flag-5'>RT-Thread</b>全球<b class='flag-5'>技術</b>大會:螢石研發團隊使用<b class='flag-5'>RT-Thread</b>的<b class='flag-5'>技術</b>挑戰

    RT-Thread全球技術大會:Kconfig在RT-Thread中的工作機制

    RT-Thread全球技術大會:Kconfig在RT-Thread中的工作機制 ? ? ? ? ? ? ? 審核編輯:彭靜
    的頭像 發表于 05-27 14:49 ?2349次閱讀
    <b class='flag-5'>RT-Thread</b>全球<b class='flag-5'>技術</b>大會:Kconfig在<b class='flag-5'>RT-Thread</b>中的工作機制

    RT-Thread全球技術大會:RT-Thread測試用例集合案例

    RT-Thread全球技術大會:RT-Thread測試用例集合案例 ? ? ? ? ? 審核編輯:彭靜
    的頭像 發表于 05-27 16:34 ?2831次閱讀
    <b class='flag-5'>RT-Thread</b>全球<b class='flag-5'>技術</b>大會:<b class='flag-5'>RT-Thread</b>測試用例集合案例

    RT-Thread文檔_RT-Thread SMP 介紹與移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植
    發表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與移植

    RT-Thread文檔_ulog 日志

    RT-Thread文檔_ulog 日志
    發表于 02-22 18:42 ?1次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>ulog</b> <b class='flag-5'>日志</b>

    RT-Thread v5.0.2 發布

    RT-Thread 代碼倉庫地址: ●? https://github.com/RT-Thread/rt-thread RT-Thread 5.0.2 版本發布
    的頭像 發表于 10-10 18:45 ?3101次閱讀
    <b class='flag-5'>RT-Thread</b> v5.0.2 發布