3

Vxworks 声明互斥信号量:不能在 ISR 中给出,而条件对二进制和计数信号量有效。

我无法理解相同的原因。

谢谢,扎克斯。

4

2 回答 2

9

请记住,必须首先获取/获取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 的特定情况?

于 2010-12-03T02:36:13.207 回答
0

不应在中断中使用互斥锁,因为:

它们包括一个优先级继承机制,只有在互斥锁是从任务中给出和获取时才有意义,而不是中断。 中断不能阻塞以等待由互斥锁保护的资源变为可用

https://www.freertos.org/Real-time-embedded-RTOS-mutexes.html

于 2021-11-05T02:16:14.727 回答