2010-12-02 114 views

回答

8

请记住,必须首先获取/采取互斥锁然后发布/给定。 另外,获取互斥锁的任务拥有它。这可以防止另一个任务释放它不拥有的互斥锁。在这种情况下,很明显,由于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运行。 ISR现在在B运行时执行。 ISR是否仍然有效?

无论如何,简单的事实是一个互斥量总是用在一对Get/Set中。我没有看到一个使用情况,你会有一个孤立的semGive。

是否存在一个特定的情况,您需要从ISR环境中获取semGive?

+0

我同意你的意见,任何信号量不应该在ISR中获得,但在互斥量不足的情况下,相同的任务会释放它早期获得的信号量。所以声明“互斥体不能在ISR中发布”听起来有误称 – Zaks 2010-12-03 05:35:46