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


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

這個(gè)軟件包主要完成以下工作:
- 任務(wù)啟動(dòng):協(xié)調(diào)多個(gè)應(yīng)用線程順序啟動(dòng),不受任務(wù)優(yōu)先級(jí)影響,避免任務(wù)之間依賴出現(xiàn)的消息無(wú)效或其他異常情況;所有任務(wù)初始化完畢后,會(huì)有一個(gè)統(tǒng)一的system-ready事件廣播,然后退出啟動(dòng)協(xié)調(diào);
- 任務(wù)退出:順序退出,例如可預(yù)知的關(guān)機(jī),每個(gè)任務(wù)可能在關(guān)機(jī)前都要做一些本任務(wù)需要收尾的工作,例如重要信息存儲(chǔ)等,這樣就不需要將關(guān)機(jī)事件在某個(gè)地方調(diào)用所有任務(wù)提供的api執(zhí)行一遍,自己的事情自己做;
消息訂閱和發(fā)布分發(fā):這個(gè)就是上篇文章里面講的內(nèi)容了:Thread msg Topic-pub/sub;
延時(shí)事件:這個(gè)里面就用到了上面的event loop了。
每個(gè)thread都是一樣的,所以也寫了py腳本,直接用腳本生成,開(kāi)發(fā)者只需要關(guān)注自己的棧+優(yōu)先級(jí)+事件+消息payload;
四. 使用演示
直接使用thread_manager軟件包,這個(gè)會(huì)打開(kāi)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)
這樣會(huì)打開(kāi)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開(kāi)發(fā)板
menuconfig配置

更新軟件包 pkgs --update

編譯

測(cè)試

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
主要延時(shí)執(zhí)行兩個(gè)函數(shù)

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

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

整體測(cè)試圖片:
-
開(kāi)發(fā)板
+關(guān)注
關(guān)注
26文章
6433瀏覽量
121180 -
軟件包
+關(guān)注
關(guān)注
0文章
117瀏覽量
12179 -
RT-Thread
+關(guān)注
關(guān)注
32文章
1644瀏覽量
45264
發(fā)布評(píng)論請(qǐng)先 登錄
基于RT-Thread的RoboMaster電控框架設(shè)計(jì)
RT-Thread Vector軟件包:嵌入式開(kāi)發(fā)的動(dòng)態(tài)數(shù)組容器 | 技術(shù)集結(jié)
RT-Thread 軟件包介紹
RT-Thread軟件包定義和使用
RT-Thread社區(qū)上有哪些優(yōu)秀的軟件包?
2022 RT-Thread全球技術(shù)大會(huì):RT-Thread軟件包
RT-Thread全球技術(shù)大會(huì):恩智浦新增100+軟件包
RT-Thread env工具安裝
RT-Thread在線軟件包改為本地軟件包的方法
基于 RT-Thread 的 RoboMaster 電控框架(一)
基于RT-Thread的RoboMaster電控框架(二)
RT-Thread使用cjson軟件包發(fā)送64位長(zhǎng)整型數(shù)據(jù)
RT-Thread中Agile Modbus軟件包的使用方法
RT-Thread中mymqtt軟件包的使用方法
RT-Thread任務(wù)+消息訂閱管理框架軟件包:thread_manager+event_loop
評(píng)論