web-dev-qa-db-ja.com

armベースの組み込みシステムでのmutexの実装

Armv7プロセッサと基本的なスケジューラを備えた組み込みシステムにミューテックスを実装しました

Armv7命令セットには、電力効率のために使用されるいくつかの命令があります。

これらの命令の2つはWFE(イベント待ち)とWFI(割り込み待ち)です。命令は、イベントが発生するか、割り込みが発生するまで、プロセッサをアイドルモードにします。

また、命令に伴う条件が真の場合、プロセッサはアイドルモードを終了します。

Mutexの取得に失敗したときにこれらの命令の1つを使用して、タイマー割り込みが発生し、スケジューラが別のタスクにコンテキストスイッチするまで、残りのタイムスライスの間、プロセッサはアイドル状態になります。

電力消費に関心がない場合、ビジーループの代わりにこれらの命令を使用する理由は本当にありますか?

5
omer12433

いいえ。低電力モードはMCUに大きく依存します。さまざまなシリコンサプライヤーの間で、以下が異なる場合があります。

  • スリープ/ディープスリープモードで無効になる周辺機器/クロック
  • MCU周辺機器/ CPUをウェイクアップするシーケンスは何ですか

WFIおよびWFE命令は、CPUを他の周辺機器と同期するようにARM)によって設計されています。

省電力に関心がない場合は、ループすることもできます。一部のRTOSμc/ OS-IIなど)は、アイドルタスクで実行された処理に基づいて統計を作成します(CPUほとんどのRTOSではアイドル状態です)。

1
Jocelyn

WFIWFEはどちらもCPUをサスペンドするため、どちらもそのCPUが他のタスクを実行するのを防ぐことに注意してください。

「ミューテックス」が「カーネルレベルのスピンロック」を意味する場合、そうです。WFEおよびSEV命令を使用して、ビジーループを回避できます。

「ミューテックス」とは、実行の「スレッド」(CPUではない)を一時停止できるOSレベルのプリミティブを意味する場合、ミューテックスから直接使用することはできません。スレッドがミューテックスの取得に失敗した場合、スレッドはそれ自体を待機キューに追加し、カーネルスケジューラを呼び出す必要があります。実行するタスクがないときにWFIを実行するのはスケジューラの責任です。

消費電力が問題にならない場合でも、ビジーループがメモリバスのパフォーマンスにどのように影響するかを検討することをお勧めします。不必要な読み取りを行うと、同じバスにアクセスする他のCPU /ハードウェアの速度が低下する可能性があります。

0
StaceyGirl