3
A
回答
8
请记住,必须首先获取/采取互斥锁然后发布/给定。 另外,获取互斥锁的任务拥有它。这可以防止另一个任务释放它不拥有的互斥锁。在这种情况下,很明显,由于ISR无法获得互斥体(或者任何信号量 - 这是一个阻塞操作),因此它就不能提供互斥体。
ISR很可能会给二进制或计数信号标志发生某种事情的任务。但是互斥体总是一个取/给的对。
澄清一点。在VxWorks中,ISR上下文是而不是与任务的上下文相同!
下列情况是无效的:
Task A ISR semTake(mutex) .... semGive(mutex)
任务A 拥有互斥。当ISR运行时,它会在完全不同的上下文中执行。目前大多数处理器都有独立的ISR堆栈。由于任务A拥有这个互斥量,ISR如何放弃它?事实上,当A有互斥量时,ISR会发出什么保证。
即使假设在ISR你“可以”给一个互斥体,你会如何处理以下情形:
Task A Task B ISR semTake(mutex) ... <context switch happens> <B runs> semGive(mutex)
任务A被转出,由于无关的互斥呼叫,而任务B运行。 ISR现在在B运行时执行。 ISR是否仍然有效?
无论如何,简单的事实是一个互斥量总是用在一对Get/Set中。我没有看到一个使用情况,你会有一个孤立的semGive。
是否存在一个特定的情况,您需要从ISR环境中获取semGive?
相关问题
- 1. 需要释放互斥锁?
- 2. 为什么互斥已经解锁
- 3. 为什么TMutex方法Acquire()不锁定互斥锁?
- 4. 为什么即使您拥有互斥锁,互斥锁try_lock也会返回false?
- 5. '互斥锁'究竟做了什么?
- 6. 互斥锁:“阻塞”是什么意思?
- 7. 互斥锁无数次
- 8. 互斥锁和锁
- 9. 无法创建互斥锁。 ASP.NET
- 10. 为什么Boost scoped_lock不能解锁互斥锁?
- 11. 互斥锁是否需要释放,如果它超时?
- 12. 使用“扔”而不释放互斥锁在win32中安全吗?
- 13. 使用互斥锁'使用'时,是否尝试最终释放?
- 14. 互斥锁/解锁命令
- 15. 实现互斥锁?
- 16. 为什么睡眠功能禁用我的互斥锁
- 17. 为什么WaitForMultipleObjectsEx在APC期间获取互斥锁?
- 18. 为什么布尔标志不能用作wait()/ notifyAll()互斥锁?
- 19. 为什么unique_lock电话解锁,当他不拥有互斥?
- 20. 通过私有互斥锁锁定对象的最佳方法是什么?
- 21. 为什么lock_guard可以通过unique_lock获取已经锁定的互斥锁?
- 22. 从头开始实施互斥锁
- 23. condition_variable在无锁实现中无互斥锁
- 24. 这些div为什么相互排斥?
- 25. 使用dispatch_sync作为一个互斥锁
- 26. 这应该称为互斥锁吗?
- 27. 什么是“分裂互斥”?
- 28. 锁,监视器,互斥
- 29. “安全”处理互斥锁?
- 30. 当互斥锁不够时?
我同意你的意见,任何信号量不应该在ISR中获得,但在互斥量不足的情况下,相同的任务会释放它早期获得的信号量。所以声明“互斥体不能在ISR中发布”听起来有误称 – Zaks 2010-12-03 05:35:46