Armv7プロセッサと基本的なスケジューラを備えた組み込みシステムにミューテックスを実装しました
Armv7命令セットには、電力効率のために使用されるいくつかの命令があります。
これらの命令の2つはWFE(イベント待ち)とWFI(割り込み待ち)です。命令は、イベントが発生するか、割り込みが発生するまで、プロセッサをアイドルモードにします。
また、命令に伴う条件が真の場合、プロセッサはアイドルモードを終了します。
Mutexの取得に失敗したときにこれらの命令の1つを使用して、タイマー割り込みが発生し、スケジューラが別のタスクにコンテキストスイッチするまで、残りのタイムスライスの間、プロセッサはアイドル状態になります。
電力消費に関心がない場合、ビジーループの代わりにこれらの命令を使用する理由は本当にありますか?
いいえ。低電力モードはMCUに大きく依存します。さまざまなシリコンサプライヤーの間で、以下が異なる場合があります。
WFI
およびWFE
命令は、CPUを他の周辺機器と同期するようにARM)によって設計されています。
省電力に関心がない場合は、ループすることもできます。一部のRTOSμc/ OS-IIなど)は、アイドルタスクで実行された処理に基づいて統計を作成します(CPUほとんどのRTOSではアイドル状態です)。
WFI
とWFE
はどちらもCPUをサスペンドするため、どちらもそのCPUが他のタスクを実行するのを防ぐことに注意してください。
「ミューテックス」が「カーネルレベルのスピンロック」を意味する場合、そうです。WFE
およびSEV
命令を使用して、ビジーループを回避できます。
「ミューテックス」とは、実行の「スレッド」(CPUではない)を一時停止できるOSレベルのプリミティブを意味する場合、ミューテックスから直接使用することはできません。スレッドがミューテックスの取得に失敗した場合、スレッドはそれ自体を待機キューに追加し、カーネルスケジューラを呼び出す必要があります。実行するタスクがないときにWFI
を実行するのはスケジューラの責任です。
消費電力が問題にならない場合でも、ビジーループがメモリバスのパフォーマンスにどのように影響するかを検討することをお勧めします。不必要な読み取りを行うと、同じバスにアクセスする他のCPU /ハードウェアの速度が低下する可能性があります。