補遺: PWM
先へ進む前に、最後に 1 点だけ補足しておきます。
割り込みにはそれなりにコストがかかります。プロセッサは現在実行中の命令を完了するか中断し、その後、実行を再開するのに十分な状態を保存してから、割り込みハンドラを呼び出さなければなりません。これには、貴重な実行時間のうち数 CPU サイクルが費やされます。
前の節の解法の書き方だと、スピーカー出力の 1 周期あたり 2 回の割り込みが発生します。これは 1 秒あたりおよそ 1000 回の割り込みです。nRF52833 のようなプロセッサであれば、これは問題なく動作します。
nRF52833 には、サイレンの割り込み頻度を大幅に下げられるオンボード周辺機能が実際に備わっています。Pulse-Width Modulation (PWM) ユニットは、ほかにもいろいろできますが、PWM レジスタで制御されるレートでスピーカーピン上に周期信号を生成できます。これは、サイレンで使う基本的な矩形波を生成するのに使えます。周波数を変えたいときには引き続き割り込みが必要ですが、その頻度は 1000 回/秒ではなく、1 秒あたり 10 回程度で済むかもしれません。
私の解答では PWM ユニットは使いませんでした。これは一部には、割り込みに焦点を当てたかったからです。ただし、もう 1 つの大きな理由は、nRF52833 の PWM ユニットがかなり複雑で、理解しづらいことでした。制約の厳しいベアメタル環境では、単純な方法で何かを動かせるのはいつでも魅力的です。
挑戦してみる気があるなら、ぜひサイレンに PWM ユニットを使ってみてください。