一. 有個簡單的問題(什么是愛情)
為什么開源RTOS都只將我們送到Main?卻沒有一個開源的任務管理+消息訂閱框架+延時消息處理框架。就像LVGL好像沒有開源的類似于手表功能頁面切換框架。
上篇文章有個讀者留言,是否可以支持RT-Thread,索性放假也無聊,所以就整了兩個軟件包:event loop+thread_manager
二. event loop軟件包一個是event loop軟件包(實際上這個18年的時候在好吧!再包一層,講講思想講過理論了,只是一直沒有做成軟件包,總想為RT-Thread做點什么,但是一直沒有pr過東西,慚愧,終于算是圓了夢):這個軟件包的主要主要就是當你延時做什么事情時,不需要開關(guān)定時器,幫你包好了。只有三個接口(注意入?yún)⑹侵羔槪?可以將指針強轉(zhuǎn)數(shù)值使用):
#defineEVT_LOOP_PUSH(pfunc, pargs, delay) //延時delay執(zhí)行pfunc(pargs)#defineEVT_LOOP_REMOVE(pfunc) //移除已經(jīng)入列的執(zhí)行pfunc#defineEVT_LOOP_REMOVE_WITH_ARGS(pfunc, pargs) //移除已經(jīng)入列的執(zhí)行pfunc并且參數(shù)pargs
源碼:?https://github.com/Bluetooth-BLE/event_loop
event_loop/├── README.md # 英文說明├── README_zh.md # 中文說明├── inc/│ └── event_loop.h # 對外 API├── src/│ └── event_loop.c # 實現(xiàn)├── samples/│ └── event_loop_test.c # 可選 MSH 示例└── SConscript # DefineGroup、CPPPATH
readme.md有詳細介紹


三. thread_manager軟件包
https://github.com/Bluetooth-BLE/thread_manager
thread_manager/├── README.md # 英文說明├── README_zh.md # 中文說明├── inc/ # 對外頭文件(thread.h, thread_msg.h, thread_manager.h, thread_sysready.h 等)│ └── thread_config.h # 應用配置:線程 ID、棧、優(yōu)先級(按產(chǎn)品修改)├── src/│ ├── thread.c # 注冊表引導、thread_task_lookup、thread_spawn_all_registered│ ├── thread_msg.c # 注冊表初始化、分發(fā)、轉(zhuǎn)發(fā)、訂閱 API│ ├── thread_manager.c # 管理線程、啟停同步│ └── thread_sysready.c # 可選 system-ready(開啟 THREAD_SYSTEM_READY 時)├── samples/ # 示例任務 + thread_file_gen.py(生成輔助腳本)└── SConscript # DefineGroup、CPPPATH

這個軟件包主要完成以下工作:
- 任務啟動:協(xié)調(diào)多個應用線程順序啟動,不受任務優(yōu)先級影響,避免任務之間依賴出現(xiàn)的消息無效或其他異常情況;所有任務初始化完畢后,會有一個統(tǒng)一的system-ready事件廣播,然后退出啟動協(xié)調(diào);
- 任務退出:順序退出,例如可預知的關(guān)機,每個任務可能在關(guān)機前都要做一些本任務需要收尾的工作,例如重要信息存儲等,這樣就不需要將關(guān)機事件在某個地方調(diào)用所有任務提供的api執(zhí)行一遍,自己的事情自己做;
消息訂閱和發(fā)布分發(fā):這個就是上篇文章里面講的內(nèi)容了:Thread msg Topic-pub/sub;
延時事件:這個里面就用到了上面的event loop了。
每個thread都是一樣的,所以也寫了py腳本,直接用腳本生成,開發(fā)者只需要關(guān)注自己的棧+優(yōu)先級+事件+消息payload;
四. 使用演示
直接使用thread_manager軟件包,這個會打開event_loop軟件包
RT-Thread online packages systempackages---> [*] Thread manager (task registry, message dispatch,manager thread)---> [*] Publishsystem-ready event after startup sync [*] Build samples (thread_test/thread_test1/thread_test2)
這樣會打開event loop
RT-Thread online packages system packages ---> [*] Eventloop(delayed dispatch: mq + soft one-shottimer)---> (32) Maximum delayed slots intable (15)Message queuedepth(immediate + due callbacks) (3072) Event loop thread stacksize(bytes) (12) Event loop threadpriority(smaller = higher5 [*] Build event_loop sample (event_loop_test.c)
我依然使用的是我的曹孟德52840開發(fā)板
menuconfig配置

更新軟件包 pkgs --update

編譯

測試

msh命令
msh >helpRT-Thread shell commands:gpio_sample - gpio sampleevt_loop_test - run event_loop delayed demotmsg_send - send zero-payload event to task mailboxtmsg_send_de - send delayed zero-payload event via event_looptmsg_cal - cancel pending delayed eventfortask/msgpin - pin [option]clear - clear the terminal screenversion - show RT-Thread version informationlist - list objectshelp - RT-Thread shellhelpps - List threadsinthe systemfree - Show the memory usageinthe systembacktrace -printbacktrace of a thread
evt_loop_test - run event_loop delayed demo
主要延時執(zhí)行兩個函數(shù)

tmsg_send - send zero-payload event to task mailbox
向某個任務id 發(fā)送消息id, 例如:tmsg_send 1 1 往任務id1發(fā)送msg 1
tmsg_send_de - send delayed zero-payload event via event_loop
向某個任務id 延時發(fā)送消息id, 例如:tmsg_send_de 1 1 5000 往任務id1延時5s后發(fā)送msg 1
tmsg_cal - cancel pending delayed event for task/msg
取消某個任務id的某個事件,例如:tmsg_cal 1 1 取消evt loop事件數(shù)組中往任務id1發(fā)送msg 1
evt_loop_test 3 5 test1執(zhí)行3次, test2執(zhí)行5次

tmsg_send 2 1:立刻向thread_test2線程發(fā)送hello消息,因為thread_test1和thread_test都監(jiān)聽了thread_test2的hello消息,可以看到下面有相關(guān)log打印。
tmsg_send_de 2 1 3000:延時3s后thread_test2線程發(fā)送hello消息

整體測試圖片:
-
開發(fā)板
+關(guān)注
關(guān)注
26文章
6405瀏覽量
120537 -
軟件包
+關(guān)注
關(guān)注
0文章
116瀏覽量
12176 -
RT-Thread
+關(guān)注
關(guān)注
32文章
1636瀏覽量
45190
發(fā)布評論請先 登錄
基于RT-Thread的RoboMaster電控框架設計
RT-Thread Vector軟件包:嵌入式開發(fā)的動態(tài)數(shù)組容器 | 技術(shù)集結(jié)
RT-Thread 軟件包介紹
RT-Thread軟件包定義和使用
RT-Thread社區(qū)上有哪些優(yōu)秀的軟件包?
RT-Thread env工具安裝
RT-Thread在線軟件包改為本地軟件包的方法
基于 RT-Thread 的 RoboMaster 電控框架(一)
基于RT-Thread的RoboMaster電控框架(二)
RT-Thread使用cjson軟件包發(fā)送64位長整型數(shù)據(jù)
RT-Thread中Agile Modbus軟件包的使用方法
RT-Thread中mymqtt軟件包的使用方法
RT-Thread任務+消息訂閱管理框架軟件包:thread_manager+event_loop
評論