MIPS 4KにはwaitというCPUをsleepさせて省電力を実現するインストラクションがあります。通常のLinuxやFreeBSDではカーネルモードでは使うことなくて、ユーザモードでは使えないインストラクションなはずです。勝手にユーザにCPU止められたら困りますよね。
試しにadm5120で測ってみました。
状態 | mA |
---|---|
通常 | 504 |
wait | 420 |
adm5120はSwitchなども入っているので、あまり小さくならないのかもしれませんが、ある程度の効果はあるようです。
waitから次の実行に移すには割り込みを上げる必要があります。割込みが上がりハンドラが呼び出された後にwaitの次のインストラクションが実行されます。
mruby on YABMではTimerとEthernetの受信割り込みを使っています。Timerは10msでEthernetは随時上がります。
waitを使うためにはEthernetの受信割り込みを止める、またはパケットが入ってこない設定にする、Timerを指定した時間、または長めに指定するなどにする必要があります。
MIPSは1本のTimerで時間も管理しているので、結構厄介です。
ちょっと複雑になるのと効果が薄そうなので、とりあえず実装しないつもりです。
この手の省電力はOSがある場合は使うのが非常に難しいですが、BearMetalの場合には考えれば使いようがあるような気もします。