Zak*_*aks 3 mutex semaphore vxworks
Vxworks声明相互排斥信号量:不能在ISR内部给出,而条件是二进制和计数信号量的条件.
我无法理解同样的原因.
谢谢,Zaks.
请记住,一个互斥体必须首先获取/取出,然后发布/给出.此外,获取互斥锁的任务拥有它.这可以防止另一个任务释放它不拥有的互斥锁.
在这种情况下,很明显,由于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?