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

Zak*_*aks 3 mutex semaphore vxworks

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

我无法理解同样的原因.

谢谢,Zaks.

Ben*_*oit 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?