嵌入式技术论坛
直播中

百灵千岛酱

9年用户 528经验值
擅长:处理器/DSP
私信 关注
[问答]

是不是中断中不能用消息邮箱?

如题

晬賣乻hall not used in ISR (0) assert failed at rt_mb_recv:1499

我检查过,中断中没有用到rt_mb_recv,先不管这个。
我在中断中有用到rt_mb_send,它跟rt_mb_recv一样也包括宏
RT_DEBUG_NOT_IN_INTERRUPT

是不是中断中不能用消息邮箱?

回帖(9)

王鑫

2022-11-22 14:39:22
RTT的邮箱发送带挂起功能,所以不能够这样使用
举报

百灵千岛酱

2022-11-22 14:39:35
如果我要在uart中断中通知外面收到了信息,那应该怎么处理
举报

百灵千岛酱

2022-11-22 14:40:02
编程指南里是这样说的:
RT-Thread采用的邮箱通信机制有点类型传统意义上的管道,用于线程间通讯。它是线程,中断服
务,定时器向线程发送消息的有效手段。邮箱与线程对象等之间是相互独立的。线程,中断服务
和定时器都可以向邮箱发送消息,但是只有线程能够接收消息(因为当邮箱为空时,线程将有可
能被挂起)。
那到底能不能向邮箱发送消息?看代码应该是不能发消息,但这个编程指南的叙述怎么解释呢?
那要是我不能用这种通信机制,我是不是要用全局变量来通知线程?那不是回到原始社会了。。。。
又或者我进中断时不用
/ enter interrupt /
rt_interrupt_enter();?
举报

王鑫

2022-11-22 14:40:14
好像不是呢,从你的assert信息来看,是使用rt_mb_recv,这个。。。
举报

百灵千岛酱

2022-11-22 14:40:31
我检查过没有在中断用rt_mb_recv,估计是rt_mb_send后,中断挂起,没有
  1. / leave interrupt /
  2. rt_interrupt_leave();
系统调度到线程中去,刚好又到rt_mb_recv这里,结果就发出这个错误信息了,这种情况大概一天才出现一次,所以很不好查。
举报

百灵千岛酱

2022-11-22 14:40:43
仔细看了一下Finsh的实现,finsh在使用uart1时设置的回调函数
  1. static rt_err_t finsh_rx_ind(rt_device_t dev, rt_size_t size)
  2. {
  3. RT_ASSERT(shell != RT_NULL);

  4. /* release semaphore to let finsh thread rx data */
  5. rt_sem_release(&shell->rx_sem);
  6. return RT_EOK;
  7. }

这个回调函数是在uart1中断里调用的,而sem这种通信机制是没有
  1. RT_DEBUG_NOT_IN_INTERRUPT
的,但是rt_sem_release应该也带挂起功能吧。
那是否说明我关闭RT_DEBUG,就可以在中断中用消息邮箱?

我现在已经不知道哪种通信机制可以在中断中可以用了。。。。 [s:163]
举报

王鑫

2022-11-22 14:40:54
rt_sem_release可以,rt_mb_send/rt_mq_send可以。rt_mb_send_wait不行

你的问题是不是不是这个,而是跑飞掉了
举报

百灵千岛酱

2022-11-22 14:41:04
程序是否跑飞我也不清楚,不排除这个可能。

现在我想搞清楚一下:
要是中断中用了rt_sem_release,而中断挂起(中断用到rt_interrupt_enter();了),这时调度到一个线程,线程运行到某一行要与另一线程通过消息邮箱通信,用到rt_mb_recv,而此时中断还没有(rt_interrupt_leave();),也就是说rt_interrupt_nest>0,那这时就是产生错误。
以上,是否可能会发生?要是有这可能,我不管在哪用rt_mb_recv都会很危险?

再有:
引用: rt_sem_release可以,rt_mb_send/rt_mq_send可以。rt_mb_send_wait不行

你的问题是不是不是这个,而是跑飞掉了
引用: RTT的邮箱发送带挂起功能,所以不能够这样使用

大哥,你把我搞糊涂了….
举报

王鑫

2022-11-22 14:41:13
你不要想左了,rt_interrupt_enter/leave和任务挂起没半毛钱的关系
举报

更多回帖

发帖
×
20
完善资料,
赚取积分