MENU

組込みソフトウェアの基本知識 ~メインループと割り込み~

今回は「micro:bit」を使って、組込みソフトウェアの基本知識のひとつの「メインループ」と「割り込み」について書いてみようと思います。

目次

「micro:bit」のメインループ

Microsoft MakeCode for micro:bit」で、新しいプロジェクトを作成して表示されるプログラミング画面には「最初だけ」と「ずっと」という2つのブロックが置かれています。

ここで組込みソフトウェアの特徴の1つ紹介します。

組込みソフトウェアの特徴
・機器の電源をONにすると自動でプログラムが動き始める。
・電源がONの間、プログラムは動き続ける。

「micro:bit」では、電源をONにすると「最初だけ」のブロック内の処理が自動で実行されます。
「最初だけ」のブロック内の処理を最後まで実行すると、続けて「ずっと」のブロック内の処理を実行します。
「ずっと」のブロック内の処理を最後まで実行すると、「ずっと」のブロック内の先頭の処理にからふたたび実行します。
こうして電源ONの間、「ずっと」のブロック内の処理が繰り返し実行されることになります。

組込みソフトウェア界隈では、この「ずっと」の処理を「メインループ」と呼んでいます。
「メインループ」には機器の電源がONの間、永続的に実行する処理を配置します。
ちなみに「最初に」の処理は「初期化処理」と呼んだりします。
「初期化処理」では、プログラムや機器の状態の初期値(起動時の状態)を設定する処理を配置します。
では実際に動きを確認してみましょう。

①「最初だけ」のブロックに、ツールボックス「基本」の「LED画面に表示」のブロックを配置する。
 「LED画面に表示」のブロックに[◆]を設定する。

②「ずっと」のブロックに、「LED画面に表示」のブロックを2個を配置する。
 「LED画面に表示」のブロック(1個目)に[〇]を設定する。
 「LED画面に表示」のブロック(2個目)に[×]を設定する。

③シミュレーターの下の「シミュレーターを再起動する」をクリックする。

シミュレーターを再起動することで、機器の電源ONを模擬します。

「シミュレーターを再起動する」をクリックすると[◆]→[〇]→[×]→[〇]→[×]→[〇]→…と表示されます。
起動後に「最初に」の処理が実行され、その後「ずっと」の処理が繰り返し実行されることが確認できると思います。

組込みソフトウェアでは、「最初に」と「ずっと」の2つは以下のように使い分けます。
・「最初に(=初期化処理)」は、プログラムや機器の初期化を行う処理を設定する。
・「ずっと(=メインループ)」は、電源ONの間で継続して実行する処理を設定する。

「micro:bit」の割り込み

次に「割り込み」について解説します。
「ずっと」のブロックが「メインループ」と説明しました。では「割り込み」に該当するブロックはどれになるのでしょう?
答えの1つは「ボタンが押されたとき」というブロックになります。
答えの1つという意味ありげな書き方をしていますが、気にせず早速使ってみましょう!

さきほど作成したプログラムにブロックを配置していきます。
①プログラムエリアに、ツールボックス「入力」の「ボタン[A]が押されたとき」のブロックを配置する。


②「ボタン[A]が押されたとき」のブロックに、「LED画面に表示」のブロックを配置する。
 「LED画面に表示」のブロックに[A]を設定する。

③シミュレーターの下の「シミュレーターを再起動する」をクリックする。
「シミュレーターを再起動する」をクリックすると[◆]→[〇]→[×]→[〇]→[×]→[〇]→…と表示されます。

とくに変化なく、さきほど作成したプログラムと同じ動きをしています。
さてここで「ボタン[A]が押されたとき」のブロックを追加したのでボタンAを押してみましょう。
シミュレーターのボタンAをクリックしてみてください。クリックすると[A]が表示されるかと思います。
ボタンAをクリックすると「A」が1秒間表示され、その後何事もなかったかのように再び「〇」「×」表示が再開します。


ボタンAをクリックすると「ボタン[A]が押されたとき」の処理が「メインループ」の処理に割り込んで行われました。
これが「割り込み」です。

「割り込み」は発生したイベントに即時に反応したいときに使用します。
今回の例では「割り込み」を使用することで「ボタンが押された」というイベントに即時に反応することができました。

しかし、ここで気に留めておいて欲しいのは「メインループ」からみると「割り込まれた」ということです。
今回の例では「メインループ」は「〇」「×」を1秒ずつテンポよく表示していました。しかし割り込まれたことでテンポを乱してしまいました。これは「割り込み」の処理の間、「メインループ」の処理が中断されてしまうためです。
これにより想定していた表示タイミングがずれることになります。

タイミング        : 0 1 2 3 4 5 6 7 8 9
「割り込み」が[ない]とき: 〇→×→〇→×→〇→×→〇→×→〇→×→…
「割り込み」が[ある]とき: 〇→×→〇→×→A→〇→×→〇→×→〇→…
 →タイミング「4」で「割り込み」が発生して[A]を表示。タイミング「5」以降の表示が逆になる。

このように「割り込み」によって「メインループ」が影響を受けることがあります。
どのイベントを「割り込み」で処理するか?「メインループ」の処理への影響はないか?を考えながらプログラミングを行う必要があります。

「割り込み」の処理は「メインループ」の処理に割り込んで実行される。
「割り込み」の処理によって「メインループ」の処理は中断される。

実際の製品では、「ボタンが押されたとき」や「握ったとき」といったユーザー操作や、「熱くなったとき」とか「ぶつかったとき」のような事象に反応するときなどに「割り込み」を利用しています。他にも「何秒経ったとき」とか「データを受信したとき」といったようにイベントはたくさんあります。これが冒頭で「答えの1つ」と書いた理由となります。
「micro:bit」には他にも「~とき」というブロックでいろいろな割り込みが用意されていますので、ぜひ試してみてください。

今回は、「メインループ」と「割り込み」(あと「初期化処理」)について簡単に説明してみました。
「割り込み」は奥が深く、他にも知っておくべきことがありますので別の記事で説明していきたいと思います。

よかったらシェアしてね!
目次