Control-Cでプログラムを止める(RPiベアメタルMicroPython)

kbd-intr.png

前回のシリアルポートの割り込み処理ですが、一番やりたかったのが「^Cでプログラムを止める」ことです。これができないと、無限ループになったらリセットするしかありません。

プログラム実行中に^Cでプログラムを止めるには、割り込み処理で入力を受け付け、入力された文字が^Cかどうかチェックします。
^Cだったら実行中のプログラムを中断する処理を走らせます。

この後段の部分はMicroPythonでは

lib/utils/interrupt_char.c

の中の

mp_keyboard_interrupt()

で実装されているので、呼び出すだけです。
特にひっかかるところもなく実装できました。
やはり^Cでプログラムがビシッ!と止まるのは良いですね(笑)。

ちなみに、既存の実装を見比べてみると、ESP8266とESP32はmp_keyboard_interrupt()を呼び出すだけの処理ですが、STM32では1度目は呼び出し、それで処理がされていなければ例外処理を使って直接最上位のスレッドに例外を伝達するという処理になっていました。
これはpendsv.cの中のpendsv_kbd_intr()という関数で実現されています。
また、STM32は複数のUARTを持てるので、REPLに使われるUARTだけで^Cを有効にするといったことも考慮されていました。

コメント