为什么无法从ISR中释放互斥锁

时间:2010-12-02 13:26:23

标签: mutex semaphore vxworks

Vxworks声明相互排斥的信号量:不能在ISR内部给出,而条件是二进制和计数信号量的条件。

我无法理解原因。

谢谢, 扎克斯。

1 个答案:

答案 0 :(得分:9)

请记住首先要获取/获取互联网 然后 。 此外,获取互斥锁拥有的任务。这可以防止另一个任务释放它不拥有的互斥锁。

在这种情况下,很明显,由于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运行。当B运行时,ISR现在执行。它是否仍然适用于ISR?

无论如何,简单的事实是在一对Get / Set中总是使用互斥锁。我没有看到一个用例,你会有一个孤立的semGive。

您是否有特定的情况需要从ISR上下文中获取semGive?