Arduino上のメニューシステム
Arduinoはベアメタル環境で動作します。つまりOSという仲介者が存在せず、ハードウェアを直接制御するプログラムが1つだけ実行される環境です。この環境では、PCのように複数のプログラムを同時に実行することはできません。メモリ全体を1つのプログラムが占有し、CPUも1つのloop()関数を延々と実行し続けます。
この制約により、メニューもアプリケーションも、それぞれが完全に独立した単一のプログラムとして存在します。メニューを表示している間はメニュープログラムだけが動作し、アプリケーションを実行している間はそのアプリケーションだけが動作します。プログラムを切り替えるには、現在のプログラムを完全に終了し、ブートローダーが次のプログラムをフラッシュメモリから読み込んで起動する必要があります。
ベアメタル環境では、実行中のプログラムを外部から制御する仕組みが存在しないため、プログラム自身が「次に何を起動するか」をフラッシュメモリに書き込む必要があります。この書き込みタイミングが極めて重要です。
起動直後のsetup()関数実行時は、システムが最も安定した状態にあります。フラッシュキャッシュは初期状態で、不整合が発生する可能性がありません。SRAMも静的初期化のみが完了した清潔な状態で、ヒープの断片化も起きていません。さらに割り込み処理も最小限しか有効になっておらず、複数の割り込みが競合してフラッシュ書き込みを妨害する危険性もありません。
一方、プログラム実行中や終了時にフラッシュ書き込みを行うと、様々なリスクが生じます。キャッシュの不整合により書き込みが正しく行われない可能性があり、ヒープの断片化によってメモリ確保に失敗するかもしれません。複数の割り込みが競合している状態では、フラッシュ書き込み中に別の処理が割り込んでデータが破損する危険性もあります。
システムの事前準備方式は、これらの技術的制約を踏まえた設計です。アプリケーションは起動直後の最も安全なタイミングで「次回はメニュープログラムを起動する」という情報をフラッシュに書き込みます。この後は通常通り動作し、終了時は単純にリセットするだけです。電源断や異常終了が発生しても、既に次回起動の設定は完了しているため、確実にメニューに戻ることができます。
ベアメタル環境特有の制約と、ハードウェアレベルの動作特性を理解した上で設計された事前準備方式は、単一プログラムしか実行できないArduino環境において、複数プログラムの切り替えを確実に実現する優れた解決策です。