为什么开源RTOS都只将我们送到Main?却没有一个开源的任务管理+消息订阅框架+延时消息处理框架。就像LVGL好像没有开源的类似于手表功能页面切换框架。
上篇文章有个读者留言,是否可以支持RT-Thread,索性放假也无聊,所以就整了两个软件包:event loop+thread_manager
二. event loop软件包
一个是event loop软件包(实际上这个18年的时候在 好吧!再包一层,讲讲思想 讲过理论了,只是一直没有做成软件包,总想为RT-Thread做点什么,但是一直没有pr过东西,惭愧,终于算是圆了梦):
这个软件包的主要主要就是当你延时做什么事情时,不需要开关定时器,帮你包好了。只有三个接口(注意入参是指针, 可以将指针强转数值使用):
#define EVT_LOOP_PUSH(pfunc, pargs, delay) //延时delay执行pfunc(pargs)
源码: https://github.com/Bluetooth-BLE/event\_loop
event_loop/
readme.md有详细介绍
三. thread_manager软件包
https://github.com/Bluetooth-BLE/thread\_manager
thread_manager/
这个软件包主要完成以下工作:
-
任务启动:协调多个应用线程顺序启动,不受任务优先级影响,避免任务之间依赖出现的消息无效或其他异常情况;所有任务初始化完毕后,会有一个统一的system-ready事件广播,然后退出启动协调;
-
任务退出:顺序退出,例如可预知的关机,每个任务可能在关机前都要做一些本任务需要收尾的工作,例如重要信息存储等,这样就不需要将关机事件在某个地方调用所有任务提供的api执行一遍,自己的事情自己做;
-
消息订阅和发布分发:这个就是上篇文章里面讲的内容了:Thread msg Topic-pub/sub;
-
延时事件:这个里面就用到了上面的event loop了。
每个thread都是一样的,所以也写了py脚本,直接用脚本生成,开发者只需要关注自己的栈+优先级+事件+消息payload;
四. 使用演示
直接使用thread_manager软件包,这个会打开event_loop软件包
RT-Thread online packages
这样会打开event loop
RT-Thread online packages
我依然使用的是我的曹孟德52840开发板
-
menuconfig配置
-
更新软件包 pkgs --update
-
编译
-
测试
-
msh命令
msh >help
-
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消息
整体测试图片:
添加小师弟微信↓,拉你进RT-Thread技术交流群,找到组织!
点击“阅读原文”
评论区
登录后即可参与讨论
立即登录