线程和中断如何互斥,第二篇

发布于 2021-07-21 16:19:00    浏览:132

需求:我的主线程需要同时获取线程A或中断B内的最新变化。

  • 那么如何让A、B处都通知到主线程呢?
  • 如果直接在线程A和中断B内都发送消息队列,那么鉴于中断有可能会打断线程执行,这样就留下了安全隐患。
  • 有一种简单的做法是在线程A发消息的前后,进行关中断处理。
  • 如果不关中断,可以这样:
  • 我的做法是中断先发信号量到一个辅助线程,然后在该辅助线程内发消息队列到主线程。
  • 线程A发消息队列到一个主线程。
  • 这样,可以使用互斥锁对线程A处和辅助线程处的发送消息的地方进行互斥处理。

image.png

补充一点:这里提出的方法使用了信号量,但是这并不能保存好当前中断内的实时值,所以辅助线程的优先级要高,立马能够响应,这样就可以立即来获取此处中断内的实时值。
又或者,不使用信号量,新建使用一个消息队列来替代,这样就可以保存好实时值了(这样一共涉及两个消息队列, 然后,朝主线程发消息队列消息的线程A和辅助线程处,加互斥锁,这点不变)。

我的类似帖子:
https://club.rt-thread.org/ask/question/431797.html

看了下消息队列API函数源码,里面也是有开关中断操作的。
回到我的需求:我的主线程需要同时获取线程A或中断B内的最新变化。
那么,现在可以直接在线程A或中断B内调用消息队列发送消息的API即可。 看来,事情又回归简单了。

44444444.png

55555.png
已请教大神确认,线程这边也不再需要在发消息的前后再次进行关开中断处理(rt_hw_interrupt_disable), 直接在线程A或中断B内调用消息队列发送消息的API即可。
补充一点注意事项:
需要确保在rt_mq_send函数执行过程中数据不会发生变动,等待发送完成。所以应该使用局部变量,不要使用在多线程中分布的全局数组等。

还有个问题,关外部中断期间,收到了外部中断,在打开中断后,可否继续响应该中断?
待实测说话!

还有第三个问题: 关于中断嵌套 =》 rtt支持中断嵌套。

疑问:如果关了中断后恰好又发生了中断嵌套,开中断后能否响应?这就有意思了。

.

查看更多

2 个回答
RT-Thread小师弟
RT-Thread小师弟 2 days ago
This guy hasn't written anything yet

建议发在文章版块噢

大话西游2018
大话西游2018 2 days ago
This guy hasn't written anything yet

image.png
新理解。

撰写答案

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

发布
问题

分享
好友

手机
浏览

扫码手机浏览