Vxworks 声明互斥信号量:不能在 ISR 中给出,而条件对二进制和计数信号量有效。
我无法理解相同的原因。
谢谢,扎克斯。
请记住,必须首先获取/获取Mutex,然后再释放/给予。此外,获取互斥锁的任务拥有它。这可以防止另一个任务释放它不拥有的互斥锁。
在这种情况下,很明显,由于 ISR 无法获取互斥锁(或任何信号量 - 这是一个阻塞操作),因此它无法提供互斥锁。
ISR 很可能会提供二进制或计数信号量来指示任务发生了什么事。但是互斥锁始终是一对。
澄清一点。在 VxWorks 中,ISR 上下文与任务的上下文不同!
以下场景无效:
任务 A ISR semTake(互斥体) …… semGive(互斥体)
任务 A拥有互斥锁。当 ISR 运行时,它在完全不同的环境中执行。大多数当前的处理器都有一个单独的 ISR 堆栈。既然任务 A 拥有互斥锁,ISR 怎么可能放弃呢?事实上,你有什么保证 ISR 将在 A 拥有互斥锁时触发。
即使假设您“可以”在 ISR 中提供互斥锁,您将如何处理以下情况:
任务 A 任务 B ISR semTake(互斥体) ... <发生上下文切换> <B 运行> semGive(互斥体)
由于与互斥锁无关的调用,任务 A 被关闭,任务 B 运行。ISR 现在在 B 运行时执行。提供 ISR 是否仍然有效?
不管这一切,一个简单的事实是互斥锁总是在一对 Get/Set 中使用。我看不到有一个孤立的 semGive 的用例。
您是否想到了需要 ISR 上下文中的 semGive 的特定情况?
不应在中断中使用互斥锁,因为:
它们包括一个优先级继承机制,只有在互斥锁是从任务中给出和获取时才有意义,而不是中断。 中断不能阻塞以等待由互斥锁保护的资源变为可用
https://www.freertos.org/Real-time-embedded-RTOS-mutexes.html