0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RT-Thread任务+消息订阅管理框架软件包:thread_manager+event_loop

RT-Thread官方账号 2026-04-19 15:39 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一. 有个简单的问题(什么是爱情)

为什么开源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

e6a5c1ca-3bc2-11f1-ab55-92fbcf53809c.png源码: 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有详细介绍

e6c66efc-3bc2-11f1-ab55-92fbcf53809c.pnge6e81872-3bc2-11f1-ab55-92fbcf53809c.png

三. 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

e709320a-3bc2-11f1-ab55-92fbcf53809c.png

这个软件包主要完成以下工作:

  • 任务启动:协调多个应用线程顺序启动,不受任务优先级影响,避免任务之间依赖出现的消息无效或其他异常情况;所有任务初始化完毕后,会有一个统一的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配置

e71cca72-3bc2-11f1-ab55-92fbcf53809c.gif

更新软件包 pkgs --update

e73836ea-3bc2-11f1-ab55-92fbcf53809c.png

编译

e75ec10c-3bc2-11f1-ab55-92fbcf53809c.png

测试

e76fa04e-3bc2-11f1-ab55-92fbcf53809c.png

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

主要延时执行两个函数

e7ceb05c-3bc2-11f1-ab55-92fbcf53809c.png

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次

e7edeea4-3bc2-11f1-ab55-92fbcf53809c.gif

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消息


e8028cec-3bc2-11f1-ab55-92fbcf53809c.gif

整体测试图片:

e8186abc-3bc2-11f1-ab55-92fbcf53809c.png

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 开发板
    +关注

    关注

    26

    文章

    6402

    浏览量

    120532
  • 软件包
    +关注

    关注

    0

    文章

    116

    浏览量

    12176
  • RT-Thread
    +关注

    关注

    32

    文章

    1636

    浏览量

    45190
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RT-Thread记录(十八、SHT21与24C02软件包

    本文学习测试一下几款典型设备的 RT-Thread I2C软件包
    的头像 发表于 07-08 11:07 5347次阅读
    <b class='flag-5'>RT-Thread</b>记录(十八、SHT21与24C02<b class='flag-5'>软件包</b>)

    基于RT-Thread的RoboMaster电控框架设计

    由于 RT-Thread 稳定高效的内核,丰富的文档教程,积极活跃的社区氛围,以及设备驱动框架、Kconfig、Scons、日志系统、海量的软件包……很难不选择 RT-Thread
    发表于 09-06 15:21 1646次阅读

    RT-Thread Vector软件包:嵌入式开发的动态数组容器 | 技术集结

    RT-Thread Vector软件包:嵌入式开发的动态数组容器 | 技术集结
    的头像 发表于 01-25 09:33 5604次阅读
    <b class='flag-5'>RT-Thread</b> Vector<b class='flag-5'>软件包</b>:嵌入式开发的动态数组容器 | 技术集结

    RT-Thread 软件包介绍

    RT-Thread 软件包介绍软件包的目的软件包在高级语言中非常常见,很多高级语言都有对应的软件包平台,比如 Python 的 PyPi,R
    发表于 05-21 19:38 6055次阅读

    RT-Thread软件包定义和使用

    RT-Thread软件包是运行于RT-Thread物联网操作系统平台上,面向不同应用领域的通用软件组件 。RT-Thread 同时提供了开放
    的头像 发表于 05-21 11:29 1.2w次阅读
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>软件包</b>定义和使用

    RT-Thread社区上有哪些优秀的软件包

    SX12XX 软件包是基于 semtech 官网 Firmware Drivers V2.1.0代码库的移植实现,目前只支持 SX1278 LoRa设备。该软件包在原代码库功能的基础上,对接 RT-Thread SPI 设备驱动
    的头像 发表于 04-03 15:35 9253次阅读

    2022 RT-Thread全球技术大会:RT-Thread软件包

    RT-Thread在2022年上半年新增几十个软件包:rtt-rust、LuatOS、gui-guider-demo。
    的头像 发表于 05-27 14:12 1680次阅读
    2022 <b class='flag-5'>RT-Thread</b>全球技术大会:<b class='flag-5'>RT-Thread</b><b class='flag-5'>软件包</b>

    RT-Thread全球技术大会:恩智浦新增100+软件包

    RT-Thread全球技术大会:恩智浦新增100+软件包,支持了很多有用的功能。             审核编辑:彭静
    的头像 发表于 05-27 14:26 1562次阅读
    <b class='flag-5'>RT-Thread</b>全球技术大会:恩智浦新增100+<b class='flag-5'>软件包</b>

    RT-Thread env工具安装

    env 是 RT-Thread 推出的开发辅助工具,针对基于 RT-Thread 操作系统的项目工程,提供编译构建环境、图形化系统配置及软件包管理功能。其内置的 menuconfig 提供了简单易用的配置剪裁工具,可对内核、组件
    的头像 发表于 01-11 09:00 3059次阅读
    <b class='flag-5'>RT-Thread</b> env工具安装

    RT-Thread在线软件包改为本地软件包的方法

    RT-Thread软件包,使用时需要手动通过 ENV 工具 更新到 本地的 packages 目录,并且 packages 目录默认不参与 Git 工程管理软件包多了,偶尔需要更
    的头像 发表于 08-11 15:02 2695次阅读
    <b class='flag-5'>RT-Thread</b>在线<b class='flag-5'>软件包</b>改为本地<b class='flag-5'>软件包</b>的方法

    基于 RT-Thread 的 RoboMaster 电控框架(一)

    由于 RT-Thread 稳定高效的内核,丰富的文档教程,积极活跃的社区氛围,以及设备驱动框架、Kconfig、Scons、日志系统、海量的软件包……很难不选择 RT-Thread
    的头像 发表于 09-19 19:55 2615次阅读

    基于RT-Thread的RoboMaster电控框架(二)

    由于 RT-Thread 稳定高效的内核,丰富的文档教程,积极活跃的社区氛围,以及设备驱动框架、Kconfig、Scons、日志系统、海量的软件包
    的头像 发表于 09-20 15:16 1940次阅读

    RT-Thread使用cjson软件包发送64位长整型数据

    开发环境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的资源为0.2.2,rt-thread版本为4.1.1,cjson软件包使
    的头像 发表于 10-11 15:09 2073次阅读
    <b class='flag-5'>RT-Thread</b>使用cjson<b class='flag-5'>软件包</b>发送64位长整型数据

    RT-Thread中Agile Modbus软件包的使用方法

    开发环境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的资源为0.2.2,Agile Modbus软件包版本为v1.1.2。工程使用上一篇
    的头像 发表于 10-11 15:37 5956次阅读
    <b class='flag-5'>RT-Thread</b>中Agile Modbus<b class='flag-5'>软件包</b>的使用方法

    RT-Thread中mymqtt软件包的使用方法

    在上一篇文章 RT-Thread中Lan8720和lwip协议栈的使用的工程基础上添加mymqtt软件包。 使能mqtt example和mqtt test,保存,等待下载更新软件包
    的头像 发表于 10-13 10:44 2115次阅读
    <b class='flag-5'>RT-Thread</b>中mymqtt<b class='flag-5'>软件包</b>的使用方法