Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

割り込みを待つ

メインループで asm::nop() のようなものではなく asm::wfi()(割り込み待ち)を使ってきたのはなぜだろう、と疑問に思ったかもしれません。

前に説明したとおり、asm::nop() は no-op(eration) を意味し、CPU が何もせずに実行する命令です。もちろん、メインループで代わりに asm::nop() を使うこともでき、その場合でもプログラムの振る舞いは同じです。一方で、マイクロコントローラの振る舞いは異なります。

asm::wfi() を呼び出すと、CPU は “Wait For Interrupt”(WFI)モードに入ります。CPU が WFI モードの間は、割り込みによって起こされるまでスリープします。スリープ中は、CPU は命令のフェッチを停止し、一部のクロックやペリフェラルをオフにして低消費電力状態に入りますが、コア自体は動作を維持します。割り込みが発生すると、CPU は復帰して通常どおり実行を続けます。

asm::wfi()asm::nop() の主な違いは、NOP 命令は即座に完了するため、ループ内で繰り返し実行されることです。NOP は、その実行自体は何もしなくても、プログラムメモリからフェッチされて実行される必要があります。世の中のほとんどのマイクロコントローラには低消費電力モードがあり(中には複数備えているものもあり、何を有効のままにするかや消費電力特性がそれぞれ異なります)、それを電力節約のために利用できますし、多くの場合そうすべきです。WFI 命令は、割り込みを受信するまで 低消費電力モードで 実行を停止します。

メインループが asm::wfi() だけで構成され、プログラムのロジックのすべてが割り込みハンドラに実装されているような、割り込み駆動のプログラムもあります。