uCOS-ii を実行している組み込みシステムについて書いています。2 つの整数 (互いに同期する必要がある値とタイムスタンプ) をアトミックに書き込む (および読み取る) 必要があります。最も簡単な方法は、2 つの値の書き込みをクリティカル セクションでラップして、割り込みやタスクの切り替えを無効にすることです。しかし、これは非常に積極的であり、割り込みを無効にすることで他のリアルタイムのものを台無しにするのは非常に簡単だと言われました.
しかし、2 つの整数を書き込むのは非常に小さな操作であるため、mutex を使用して簿記全体を処理する価値があるかどうかはわかりませんでした。
そこで、いくつかの測定を行いました。これら 2 つの値を 100 万回書き込むのにかかる時間を測定し、かかったミリ秒数を数えました。さまざまな同期メカニズムのオーバーヘッドを理解するためだけに、これらすべてを 1 つのタスクで実行しました。結果は次のとおりです。
- 同期メカニズムなし: ~65
- クリティカル セクション: ~185
- 優先度 2 のミューテックス: ~1890
- スケジューラがロックされている: ~1750
- 1 で初期化されたセマフォ: ~1165
私はこれに慣れていないため、デバッガーを接続してこれを測定したことは認めますが、プロファイラーがあるかどうかはわかりませんが、CS が最速であり、ミューテックスがセマフォよりも遅いことは理にかなっています (なぜならすべての優先順位の逆転処理があります)。
このことから、クリティカル セクションを使用するのが最善であると結論付けるべきでしょうか? それとも、割り込みを無効にするのは本当に悪いことですか? 一般に、各同期メカニズムをいつ使用するかについてのガイドラインはありますか?
更新: 同僚がスピンロックの使用を提案しました。明らかに、これはより高度な同期メカニズムよりもオーバーヘッドが小さくなります。しかし、この特定のケースでは、クリティカル セクションよりも優れているのではないかと思います。
更新 2: 考えてみると、CPU が 1 つしかないため、スピン ロックは何の役にも立ちません。コンテキストが切り替わるまでスピンします...