Vxworks声明相互排斥的信号量:不能在ISR内部给出,而条件是二进制和计数信号量的条件。
我无法理解原因。
谢谢, 扎克斯。
答案 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?