Vxworksは、相互排除セマフォは、バイナリとカウントセマフォのために条件が満たされている間、ISR内部では指定できません。ISRからミューテックスを解放できないのはなぜですか?
私は同じ理由を理解できません。
ありがとう、 Zaks。
Vxworksは、相互排除セマフォは、バイナリとカウントセマフォのために条件が満たされている間、ISR内部では指定できません。ISRからミューテックスを解放できないのはなぜですか?
私は同じ理由を理解できません。
ありがとう、 Zaks。
Mutex は、を最初に取得/取得する必要があることを覚えておいてください。次にがリリース/付与されています。 さらに、mutexを取得するタスクはを所有しています。これにより、別のタスクが自分が所有していないミューテックスを解放することを防ぎます。
ISRはミューテックス(またはそれに関するセマフォー - それはブロッキング操作です)を取得できないため、ミューテックスを与えることはできません。
ISRが何か起こることをタスクに通知するためにバイナリまたはカウントセマフォを与えるのはかなり可能性があります。しかし、ミューテックスは常に対戦相手です。
ポイントを明確にする。 VxWorksでは、ISRコンテキストはではなく、で、タスクのコンテキストと同じです!
次のシナリオは無効です:
Task A ISR semTake(mutex) .... semGive(mutex)
タスクA はミューテックスを所有しています。 ISRが実行されると、ISRは完全に異なるコンテキストで実行されます。現在のほとんどのプロセッサには、別個のISRスタックがあります。タスクAはミューテックスを所有しているので、ISRはどのようにそれをあきらめることができますか?実際には、Aがmutexを持っている間にISRが発動することをどのように保証していますか?
Task A Task B ISR semTake(mutex) ... <context switch happens> <B runs> semGive(mutex)
タスクAが原因ミューテックスとは無関係の呼び出しにスイッチアウトし、タスクBが実行されます:
も、あなたは、次のシナリオを処理する方法を、あなたはISRでmutexを与える「でした」と仮定します。 Bが実行されている間、ISRが実行されます。 ISRが与えられるのは依然として有効でしょうか?
これに関係なく、単純に、ミューテックスはGet/Setのペアで常に使用されます。孤立したsemGiveを使用するユースケースは見当たりません。
ISRコンテキストからsemGiveが必要な特定の状況がありますか?
私は、ISRでセマフォを取得すべきではないことに同意しますが、mutex cantの場合は同じタスクが先にそれを取得しています。 「ミュートはISRの中で解放できません」という言葉は間違って聞こえます – Zaks
私は特定の状況を持っていません。私はVxworksのプログラマーガイドを通っていましたが、ISRは別のコンテキストで実行されていました。 – Zaks