一. 有个简单的问题(什么是爱情)
为什么开源RTOS都只将我们送到Main?却没有一个开源的任务管理+消息订阅框架+延时消息处理框架。就像LVGL好像没有开源的类似于手表功能页面切换框架。
上篇文章有个读者留言,是否可以支持RT-Thread,索性放假也无聊,所以就整了两个软件包:event loop+thread_manager
二. event loop软件包一个是event loop软件包(实际上这个18年的时候在好吧!再包一层,讲讲思想讲过理论了,只是一直没有做成软件包,总想为RT-Thread做点什么,但是一直没有pr过东西,惭愧,终于算是圆了梦):这个软件包的主要主要就是当你延时做什么事情时,不需要开关定时器,帮你包好了。只有三个接口(注意入参是指针, 可以将指针强转数值使用):
#defineEVT_LOOP_PUSH(pfunc, pargs, delay) //延时delay执行pfunc(pargs)#defineEVT_LOOP_REMOVE(pfunc) //移除已经入列的执行pfunc#defineEVT_LOOP_REMOVE_WITH_ARGS(pfunc, pargs) //移除已经入列的执行pfunc并且参数pargs
源码: https://github.com/Bluetooth-BLE/event_loop
event_loop/├── README.md # 英文说明├── README_zh.md # 中文说明├── inc/│ └── event_loop.h # 对外 API├── src/│ └── event_loop.c # 实现├── 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、栈、优先级(按产品修改)├── src/│ ├── thread.c # 注册表引导、thread_task_lookup、thread_spawn_all_registered│ ├── thread_msg.c # 注册表初始化、分发、转发、订阅 API│ ├── thread_manager.c # 管理线程、启停同步│ └── thread_sysready.c # 可选 system-ready(开启 THREAD_SYSTEM_READY 时)├── samples/ # 示例任务 + thread_file_gen.py(生成辅助脚本)└── SConscript # DefineGroup、CPPPATH

这个软件包主要完成以下工作:
- 任务启动:协调多个应用线程顺序启动,不受任务优先级影响,避免任务之间依赖出现的消息无效或其他异常情况;所有任务初始化完毕后,会有一个统一的system-ready事件广播,然后退出启动协调;
- 任务退出:顺序退出,例如可预知的关机,每个任务可能在关机前都要做一些本任务需要收尾的工作,例如重要信息存储等,这样就不需要将关机事件在某个地方调用所有任务提供的api执行一遍,自己的事情自己做;
消息订阅和发布分发:这个就是上篇文章里面讲的内容了:Thread msg Topic-pub/sub;
延时事件:这个里面就用到了上面的event loop了。
每个thread都是一样的,所以也写了py脚本,直接用脚本生成,开发者只需要关注自己的栈+优先级+事件+消息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开发板
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
主要延时执行两个函数

tmsg_send - send zero-payload event to task mailbox
向某个任务id 发送消息id, 例如:tmsg_send 1 1 往任务id1发送msg 1
tmsg_send_de - send delayed zero-payload event via event_loop
向某个任务id 延时发送消息id, 例如:tmsg_send_de 1 1 5000 往任务id1延时5s后发送msg 1
tmsg_cal - cancel pending delayed event for task/msg
取消某个任务id的某个事件,例如:tmsg_cal 1 1 取消evt loop事件数组中往任务id1发送msg 1
evt_loop_test 3 5 test1执行3次, test2执行5次

tmsg_send 2 1:立刻向thread_test2线程发送hello消息,因为thread_test1和thread_test都监听了thread_test2的hello消息,可以看到下面有相关log打印。
tmsg_send_de 2 1 3000:延时3s后thread_test2线程发送hello消息

整体测试图片:
-
开发板
+关注
关注
26文章
6402浏览量
120532 -
软件包
+关注
关注
0文章
116浏览量
12176 -
RT-Thread
+关注
关注
32文章
1636浏览量
45190
发布评论请先 登录
基于RT-Thread的RoboMaster电控框架设计
RT-Thread 软件包介绍
RT-Thread社区上有哪些优秀的软件包?
RT-Thread env工具安装
RT-Thread在线软件包改为本地软件包的方法
基于 RT-Thread 的 RoboMaster 电控框架(一)
基于RT-Thread的RoboMaster电控框架(二)
RT-Thread使用cjson软件包发送64位长整型数据
RT-Thread中Agile Modbus软件包的使用方法
RT-Thread中mymqtt软件包的使用方法
RT-Thread任务+消息订阅管理框架软件包:thread_manager+event_loop
评论