信号量,邮箱,消息队列在中断中接收,等待时间为0可以吗?

发布于 2012-12-26 15:54:48    浏览:5533
在wiki中看到
信号量,邮箱,互斥量,消息队列是否可以在中断中使用?
互斥量只能在线程中使用,因为有 owner。
信号量,邮箱,消息队列都可以在中断中进行发送操作,不可以进行接收操作。


我需要在中断中使用,如果接收操作的等待时间设置为0,这样可以吗?

查看更多

10 个回答
zchong
zchong 2012-12-26
This guy hasn't written anything yet
不行的,你仔细想想为什么不行
grissiom
grissiom 2012-12-26
This guy hasn't written anything yet
信号量,邮箱,消息队列可以,互斥量不行
zchong
zchong 2012-12-27
This guy hasn't written anything yet
是互斥量关于防止优先级翻转的处理造成的吗?
prife
prife 2012-12-27
This guy hasn't written anything yet
信号量,邮箱,消息队列可以,互斥量不行


完全可以开一个帖子好好讨论这个问题。
这个地方分析起来蛮有意思的。
prife
prife 2012-12-27
This guy hasn't written anything yet
如果中断中执行take为什么不行呢?

take的语意是要阻塞当前的线程,所以执行take时应该具有线程上下文环境,而中断本身不具有线程上下文环境,它是中断上下文,并且中断是不能被阻塞的,我们无法通过软件挂起一个中断(不是stm32硬件中的中断suspend,不是一个概念)。
如果使用,则会导致当前被中断的线程挂起,这个线程完全可能是某个不相干的线程,它完全是无辜的。这将导致整个业务逻辑都混乱了。

所以所有可能导致线程挂起的语句都不能在中断中使用。
类似rt_malloc等函数都不可以在中断中使用。

如果是把timeout时间设置成0,OK,这个语句不会导致线程挂起,可以使用,但是真的要这样做么?也许可以考虑换个思路。
sxf_zero
sxf_zero 2012-12-27
This guy hasn't written anything yet
线程产生数据,想通过中断方式发出去,所以想到用邮箱或者消息队列
sxf_zero
sxf_zero 2012-12-27
This guy hasn't written anything yet
另外看 1.0版中多了个 rt_mb_send_wait,如果指定超时时间的话,也不能用在中断中吧
grissiom
grissiom 2012-12-28
This guy hasn't written anything yet
take(0) 还是有用的,可以作为探测信号量状态使用~
celticzy
celticzy 2013-01-03
This guy hasn't written anything yet

线程产生数据,想通过中断方式发出去,所以想到用邮箱或者消息队列


中断里产生一个信号量,单独另开一个高优先级的线程去发。我是这么干的,办法有点笨,哈哈。

撰写答案

请登录后再发布答案,点击登录
关注者
0
被浏览
5.5k

发布
问题

分享
好友

手机
浏览

扫码手机浏览