2017-05-29 5 views
0

異なる割り込みが発生したときに、キューのput関数とpull関数が呼び出されるキューがあります。このシナリオで競合状態を防止する方法はありますか? 割り込みサービスルーチンのセマフォを待つことはできませんが、同様の機能を作成する最良の方法は何ですか。 Zynq FPGAのARM-Cortex A5プロセッサを使用してコードを開発しています。ISR(割り込みサービスルーチン)でのセマフォのような同期

+1

CはISRについては認識していません。プラットフォームについて詳しく説明し、コンパイル可能なサンプルコードを表示するのが理想的です。非常に簡単なシナリオでは、ISR内部で割り込みを防止するだけで十分です。 –

+0

@FelixPalmenご意見ありがとうございます。私はそれを更新します –

+1

注 - ISRからセマフォユニットを確実にPOSTできます。これは、I/Oが完了したスレッドに信号を送る最も一般的な方法です。待つことをお勧めしません。 – ThingyWotsit

答えて

1

各割り込みがプロセッサの "割り込み禁止"状態をオンにし、処理している割り込みが同じ優先度を持っていると仮定すると(つまり、他の割り込みの実行を中断できないと仮定して)競合状態が発生していない可能性があり、ISRは共有キューにアクセスできます。

(割り込みが発生すると、プロセッサは割り込み禁止モードに入り、すべてのレジスタをスタックにプッシュし、ISRエントリポイントにジャンプしてそこで実行を継続します)ISRが完了すると、 "iret"この簡単な説明は、異なるプロセッサやプラットフォームで異なる方法で実装することができます)。

+0

共有キューインデックスの操作は、ドライバハンドラスレッドから進行中のポップのステージに関係なくISRが安全にプッシュできるようにする必要があります。 – ThingyWotsit

+0

@ThingyWotsit、あなたは絶対に正しいです。幸いにもここでは、キューはISRでのみアクセスされているようです。さもなければ、非ISRアクセス自体が安全なアクセスのために割込み禁止命令を実行すべきである。 –

関連する問題