Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
苦寻“消息广播”函数
发布于 2013-02-22 02:04:56 浏览:10223
订阅该版
ucosII有一个消息发送函数OSMboxPostOpt(),具有广播功能,即发送一个消息就可以让所有等待该消息的任务进入就绪状态,从而完成消息的分发工能,不需要另外创建消息分发任务,让程序设计变得简单许多。玩rtt许久,一直没有发现其具有类似功能的函数。 下载附件 [broadcast_test.zip](https://oss-club.rt-thread.org/uploads/4878_6e54814eba0cb81515de8939dd27a6c5.zip)
查看更多
30
个回答
默认排序
按发布时间排序
prife
2013-02-22
这家伙很懒,什么也没写!
>ucosII有一个消息发送函数OSMboxPostOpt(),具有广播功能,即发送一个消息就可以让所有等待该消息的任务进入就绪状态,从而完成消息的分发工能,不需要另外创建消息分发任务,让程序设计变得简单许多。玩rtt许久,一直没有发现其具有类似功能的函数。 --- 用事件试试? event 创建/初始化时可以设置接收事件后是否清除,如果设置为不清除,不就可以唤醒多个挂起在同一event上的任务了么? (个人猜测,没试过)
rogerz
2013-02-22
这家伙很懒,什么也没写!
>>ucosII有一个消息发送函数OSMboxPostOpt(),具有广播功能,即发送一个消息就可以让所有等待该消息的任务进入就绪状态,从而完成消息的分发工能,不需要另外创建消息分发任务,让程序设计变得简单许多。玩rtt许久,一直没有发现其具有类似功能的函数。 > >--- > > > >用事件试试? event 创建/初始化时可以设置接收事件后是否清除,如果设置为不清除,不就可以唤醒多个挂起在同一event上的任务了么? >(个人猜测,没试过) --- 似乎是不行的,不清除的话接收事件的任务就一直运行了。 uc-OS中,mbox在有任务pending的时候,msg是直接发送给任务,用广播的时候,就是发送给所有任务,然后唤醒,msg不会保存在mbox中,因此没有这个问题。 参考代码:[https://github.com/fulong/armucos/blob/master/ucos_src/os_mbox.c](https://github.com/fulong/armucos/blob/master/ucos_src/os_mbox.c) rtt中的event是不一样的,设置事件位之后,需要根据任务的设置来决定是否清除,如果都不清除,所有任务都能被唤醒,但是一般这种任务都是循环接收事件的,如果没有一个任务负责清除事件,那么这些任务都将无法重新挂起在这个事件上。而如果有任务会清除事件位,那么比他优先级低的任务都不会被唤醒。因此,一个比较tricky的办法是建一个最低优先级的任务来负责清除事件位,其他任务只接收不清除。 参考代码:[https://github.com/RT-Thread/rt-thread/blob/master/src/ipc.c](https://github.com/RT-Thread/rt-thread/blob/master/src/ipc.c) 当然,如果这类需求多的话,还是在底层加一个新的函数比较合适。
bernard
2013-02-22
这家伙很懒,什么也没写!
消息发送、邮箱发送部分确实可以修改下以提高效率了
knight_hu
2013-02-22
这家伙很懒,什么也没写!
>>ucosII有一个消息发送函数OSMboxPostOpt(),具有广播功能,即发送一个消息就可以让所有等待该消息的任务进入就绪状态,从而完成消息的分发工能,不需要另外创建消息分发任务,让程序设计变得简单许多。玩rtt许久,一直没有发现其具有类似功能的函数。 > >--- > > > >用事件试试? event 创建/初始化时可以设置接收事件后是否清除,如果设置为不清除,不就可以唤醒多个挂起在同一event上的任务了么? >(个人猜测,没试过) --- 那如果使用同一个event上得不同的标志位行不行呢?比如同一个event的32各个位,去触发32个不同任务进入就绪,然后系统自行按照优先级触发运行,各自任务中得rt_event_recv中用上RT_EVENT_FLAG_CLEAR来确保执行完复位。当你要发送信息的时候,同时把32玩位全部置位,相当于变相的分发了事件,不知道这样能满足你的要求么? 这两天我刚刚试验过同一个循环时间长度的线程,用同一个event的不同位来触发,然后几种不同触发周期的event来触发不同优先级的任务,通过实验是可以运行起来的。
Arthur Bu
2013-02-22
这家伙很懒,什么也没写!
其实我觉得综合参考RTT中事件和消息队列的源码,综合起来自己写新增加一种IPC类型broadcast,应该不会有太大的难度.
xdzy
2013-02-22
这家伙很懒,什么也没写!
>>>ucosII有一个消息发送函数OSMboxPostOpt(),具有广播功能,即发送一个消息就可以让所有等待该消息的任务进入就绪状态,从而完成消息的分发工能,不需要另外创建消息分发任务,让程序设计变得简单许多。玩rtt许久,一直没有发现其具有类似功能的函数。 >> >>--- >> >> >> >>用事件试试? event 创建/初始化时可以设置接收事件后是否清除,如果设置为不清除,不就可以唤醒多个挂起在同一event上的任务了么? >>(个人猜测,没试过) > >--- > > > >那如果使用同一个event上得不同的标志位行不行呢?比如同一个event的32各个位,去触发32个不同任务进入就绪,然后系统自行按照优先级触发运行,各自任务中得rt_event_recv中用上RT_EVENT_FLAG_CLEAR来确保执行完复位。当你要发送信息的时候,同时把32玩位全部置位,相当于变相的分发了事件,不知道这样能满足你的要求么? >这两天我刚刚试验过同一个循环时间长度的线程,用同一个event的不同位来触发,然后几种不同触发周期的event来触发不同优先级的任务,通过实验是可以运行起来的。 --- 这个方案值得参考,可以让等待这个消息的任务进入就绪状态,也避免了事件不清除的麻烦,但是个人觉得其美中不足的是它貌似不能确保每个等待这个消息的任务享有这个消息
rogerz
2013-02-23
这家伙很懒,什么也没写!
>>>那如果使用同一个event上得不同的标志位行不行呢?比如同一个event的32各个位,去触发32个不同任务进入就绪,然后系统自行按照优先级触发运行,各自任务中得rt_event_recv中用上RT_EVENT_FLAG_CLEAR来确保执行完复位。当你要发送信息的时候,同时把32玩位全部置位,相当于变相的分发了事件,不知道这样能满足你的要求么? >>这两天我刚刚试验过同一个循环时间长度的线程,用同一个event的不同位来触发,然后几种不同触发周期的event来触发不同优先级的任务,通过实验是可以运行起来的。 > >--- > > > >这个方案值得参考,可以让等待这个消息的任务进入就绪状态,也避免了事件不清除的麻烦,但是个人觉得其美中不足的是它貌似不能确保每个等待这个消息的任务享有这个消息 --- 不太理解你这里说的消息是什么,事件不能传递消息。
xdzy
2013-02-23
这家伙很懒,什么也没写!
>>>>>那如果使用同一个event上得不同的标志位行不行呢?比如同一个event的32各个位,去触发32个不同任务进入就绪,然后系统自行按照优先级触发运行,各自任务中得rt_event_recv中用上RT_EVENT_FLAG_CLEAR来确保执行完复位。当你要发送信息的时候,同时把32玩位全部置位,相当于变相的分发了事件,不知道这样能满足你的要求么? >>>这两天我刚刚试验过同一个循环时间长度的线程,用同一个event的不同位来触发,然后几种不同触发周期的event来触发不同优先级的任务,通过实验是可以运行起来的。 >> >>--- >> >> >> >>这个方案值得参考,可以让等待这个消息的任务进入就绪状态,也避免了事件不清除的麻烦,但是个人觉得其美中不足的是它貌似不能确保每个等待这个消息的任务享有这个消息 > >--- > > > >不太理解你这里说的消息是什么,事件不能传递消息。 --- 消息还是邮箱或队列中的消息,可能上面那句话我说得太含糊再解释一下:“knight_hu”的方案是模拟了事件分发功能,但不具备消息分发的功能。我要找的是具有“消息分发”功能的函数。
bernard
2013-02-23
这家伙很懒,什么也没写!
记得POSIX Thread中有消息广播的功能,你可以看看POSIX Thread中是如何实现的
xdzy
2013-02-23
这家伙很懒,什么也没写!
>记得POSIX Thread中有消息广播的功能,你可以看看POSIX Thread中是如何实现的 --- 好的,谢谢
撰写答案
登录
注册新账号
关注者
0
被浏览
10.2k
关于作者
xdzy
这家伙很懒,什么也没写!
提问
7
回答
31
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
TinyUSB Demo运行教程
2
RT-Thread学习大礼包一键带走!
3
freemodbus从机调试说明
4
【1024】瑞萨 RA 系列 BSP 制作与适配最新版本的 Keil 、 RSC、固件,较新的 FSP
5
基于 RT-Thread 星火一号开发板的俄罗斯方块
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
ART-Pi
FinSH
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
cubemx
PWM
flash
packages_软件包
freemodbus
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
用户名由3_15位
10
个答案
1
次被采纳
KunYi
4
个答案
1
次被采纳
踩姑娘的小蘑菇
2
个答案
1
次被采纳
bernard
1
个答案
1
次被采纳
rv666
1
个答案
1
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
4
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部