マイコンの基礎 - 割り込みハンドラ
概要
割り込みとは、何かしらのイベントをきっかけに、現在実行しているプログラムを一時的に中断して、そのイベントに関連する処理を行うことである。
割り込みハンドラとは、「割り込みを扱う(ハンドルする)機能」という意味である。
マイコンでは、ソフトウェアが割り込みを処理するので、一般的な割り込みハンドラとは、割り込みを処理・制御するためのプログラムのことを指す。
割り込みハンドラのことを、メインルーティンに対比して、割り込みサービスルーティンと呼ぶ場合もある。
そして、割り込みハンドラが動作するモードをハンドラモードと呼ぶ。
例えば、時計用のタイマが時間をカウントしていて、1秒毎に割り込み要求を発生させるとする。
すると、マイコンは現在行っている処理を中断して、「時計表示を1秒更新するプログラム」を実行する。
更新が終わると、中断していたプログラムを再開する。
ここでは、「時計表示を1秒更新するプログラム」が割り込みハンドラになる。(下図を参照)
割り込みとは
上記のセクションで記載した通り、割り込みとは、マイコンがメインルーティンの一連の処理を行っている時に、何かのきっかけ(イベント)でその処理を中断し、
別のルーティンで別の処理を行うことである。そのイベントを割り込み要求と呼ぶ。
割り込み要求を発生させるのは、ハードウェアである。
例えば、タイマ、通信ペリフェラル、ADC、外部端子等である。
これらの割り込み要求には別々のプログラムが用意されていて、それぞれの割り込み要求が発生した時にCPUがそれらに対応したプログラムを実行する。
しかし、タイマ、通信ペリフェラル、ADC等の動作は、それぞれ独立して行われ、CPUのプログラム実行とタイミングを合わせながら動作するわけではない。
通常、マイコンにはCPUは1つだけなので、様々な処理のプログラムを同時に実行することはできない。
そのため、割り込みという概念が必要になる。
下図に、ADCと通信ペリフェラル(受信)の場合の割り込み処理を示す。この場合、ADC用と通信ペリフェラル(受信)用に2つの割り込みハンドラが必要になる。
- ADC
- ADCの変換が終了すると、ADCから割り込み要求が発行される。
- すると、CPUは実行している処理を中断して、ADCの変換データを取り込む。
- 取り込み処理が終わると、先ほど中断した処理に戻って、続きを実行する。
- ADCの変換が終了すると、ADCから割り込み要求が発行される。
- 通信ペリフェラル
- また、ADCと並行して通信ペリフェラルの受信が行われている場合、受信動作が完了すると通信ペリフェラルから割り込み要求が発行される。
- すると、CPUは実行している処理を中断して、通信ペリフェラルの受信データを取り込む。
- 受信データの取り込みが終わると、先ほど中断した処理に戻って、続きを実行する。
※補足
割り込みに似た処理で、「例外処理」と呼ばれるものが存在する。 ソフトウェアやハードウェアの異常事態のフォールトや割り込みが発生した時に、CPUがメインプログラム以外のプログラムを実行する処理を例外処理と呼ぶ。 したがって、割り込み処理は例外処理の一種だと言える。 例外処理にどの種類の処理を含むかは、各マイコンで定義が違っており、例えばリセット処理を例外処理に含む、あるいは含まなかったりする。
スタック動作(コンテキストの保存)
割り込み要求が発生して、割り込みハンドラが実行される前に、現在のPC(プログラムカウンタ)やレジスタの状態(コンテキスト)をスタックに保存する。(PUSHと呼ぶ)
そして、割り込みハンドラが終了して、メインプログラムに戻る時に、保存されたコンテキストをスタックから戻す。(POPと呼ぶ)
一般的には、割り込みコントローラ(ハードウェア)が、PUSHとPOPを自動的に行うが、ユーザがソフトウェアでPUSH命令・POP命令を実行するマイコンも存在する。
スタックされるコンテキストの内容はマイコンによって異なる。
一般的には、PC(プログラムカウンタ)や汎用レジスタの情報が保存されるが、詳細はマイコンのデータシートに記載されている。
通常、スタックは内蔵RAMに作られる。そして、スタックのアドレスはスタックポインタで定義される。
もし、割り込みハンドラのプログラムが間違ってスタック領域を書き換えてしまうと、POPされる内容がPUSHされた内容と異なってしまい、
正常にメインルーティンに戻れなくなるので、注意が必要である。(通常は、開発ツールが管理するので、ユーザはあまり気にする必要はない)
割り込みハンドラの動作
マイコンには、様々なペリフェラルが搭載されている。
前述したタイマ、通信ペリフェラル、ADC、外部端子の他にも、LCDコントローラ / ドライバ、DMA、暗号化回路等がある。
また、通信ペリフェラルは、UART、SPI、I2C、USB、CAN等があり、それぞれの機能によって割り込みの処理内容が異なる。
例えば、ADCの場合、変換結果を取り込む。
通信ペリフェラルは、受信時には受信データを取り込むが、送信時には送信データをセットする。
その他エラーが発生した時のエラー処理も割り込みハンドラが行う。
タイマはオーバーフロー、アンダーフローした際の時間に関係する処理や、コンペアマッチ、インプットキャプチャのイベントが発生した際の処理も行う。
下図に、代表的な割り込みハンドラの種類と処理の概要を示す。実際の処理内容は、ユーザのアプリケーションで異なる。
図. 割り込みハンドラの処理内容
ハンドラモード
マイコンによっては、割り込みハンドラが動作している状態を「ハンドラモード」と呼ぶ場合がある。
Cortex-Mでは、スレッドモードとハンドラモードの2つの動作モードを定義している。(下図を参照)
通常、リセット後にメインプログラムを実行し始める時は、スレッドモードであり、例外処理などが発生したときにハンドラモードに入る。
ここでいうハンドラとは、割り込みハンドラと同じように、例外処理(割り込み、フォールト等)によって起動される専用プログラムのことを指す。