2018年05月02日

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を有効にするといったことも考慮されていました。
ラベル:MicroPython
posted by boochow at 19:15| Comment(0) | Raspberry Pi | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。
人気記事