搜索
bottom↓
回复: 3

请问RTT如何实现消息邮箱广播功能?

[复制链接]

出0入0汤圆

发表于 2011-8-12 12:23:38 | 显示全部楼层 |阅读模式
背景是这样的:
假设有N(比如N=5)个线程需要监视某个全局变量X[100]的内容,一旦X的内容发生变化(比如被通信ISR改变),则N个线程各自做出相应的响应。
这种情况在编程过程中很常见。之前使用UCOS的一种方法则是创建一个邮箱MB_x_changed。然后N个线程都等待MB_x_changed发来邮件以指示X发生了变化,如果通信ISR改变了X的内容,那么只要在ISR中向邮箱发送一则广播邮件,则N个线程都能收到邮件并转入就绪态。可是在RTT中并没有提供类似的广播邮件的功能,于是想请教一下各位,在RTT中有没有什么办法?
本人首先想到的是用事件标志,但事件标志在SET完某个标志位后不会自动RESET该位,导致每个线程都一直读到“X已变化”;但如果线程使用CLEAR功能,则只有第一个线程读到标志位为SET,其后的线程读到的都是RESET,也不能实现此功能。
特此请教各位大大,谢谢!

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果天空是黑暗的,那就摸黑生存;
如果发出声音是危险的,那就保持沉默;
如果自觉无力发光,那就蜷伏于牆角。
但是,不要习惯了黑暗就为黑暗辩护;
也不要为自己的苟且而得意;
不要嘲讽那些比自己更勇敢的人。
我们可以卑微如尘土,但不可扭曲如蛆虫。

出0入0汤圆

发表于 2011-8-15 10:25:11 | 显示全部楼层
想了下,要实现这个功能,确实比较麻烦些。目前要想做广播,只能是semaphore的形式,把semaphore全部释放。

出0入0汤圆

 楼主| 发表于 2011-8-16 11:46:08 | 显示全部楼层
回复【1楼】ffxz
想了下,要实现这个功能,确实比较麻烦些。目前要想做广播,只能是semaphore的形式,把semaphore全部释放。
-----------------------------------------------------------------------

用SEM也不妥。因为很难保证每次都是N个线程依次得到信号量。很有可能高优先级的执行完一次处理了立即又回到while(1){}里面的等待信号量的语句上,这样下次又是该高优先级的进程得到信号量。也就是说释放5次信号量,结果不是5个线程每个得到一次,而是最高优先级线程得到5次。
我觉得一个暂时可行的办法是用EVENT。自己动手写一个rt_event_set_auto_clr()函数。这个函数首先set相应位,然后通过唤醒等待列表的全部满足条件的线程,然后再自动clr该事件位(这是与普通rt_event_set()不同的地方),然后调用shedule函数。这样可以保证一次唤醒多个线程,而且每个线程只会被唤醒一次,等线程下次等待事件位的时候,又被挂起了,符合设计要求。
不知这样的思路对不对,有没有什么隐患,请大大多多指教。谢谢!

出0入0汤圆

发表于 2011-8-16 11:49:58 | 显示全部楼层
semaphore是可以的,可以先对调度器上锁,然后释放所有,再然后解锁。

关于event、mailbox、message queue是否支持广播,需要考虑下,如果确实有这种需求,可以在下一个版本加入
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-9-27 07:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表