マイコン制御を行う上では避けて通れない「割り込みハンドラ」。
「割り込みハンドラ」について解説した記事は多くあるものの、それを読んでもイマイチよく分かりません。
本記事では「割り込みハンドラとは何か」、それとセットでよく出てくる「ベクターテーブルとは何か」について解説していこうと思います。
割り込みとは
今行っている処理を中断して、別の処理を行うことです。
マイコンは通常プログラムを上から順にしか処理していくことしか出来ませんが、この割り込みというものは現在行っている処理を無理やり止め、別の関数を走らせます。そして割り込んだプログラムの処理が終わったら、また元の処理を行います。
ハンドラとは
割り込みで実行する関数のことです。
なので一般的には「ハンドラ」とは言わず「割り込みハンドラ」と言うことが多いです。
割り込みハンドラの発動条件についてはマイコン毎異なるのですが、主要なところで言えば
- ボタンの押下
- タイマーが設定した時間経過した
- センサーのデジタル値変換処理が終わった
などがあります。
マイコンによって設定できる割り込みハンドラは決まっているのですが、例えばArduino Uno3ではピン番号2と3が割り込みに対応しています。設定次第にはなりますが、2番ピンの電圧がLOWになった瞬間に特定の処理(割り込みハンドラ)を実行することが出来ます。
割り込みコントローラーについて
割り込みハンドラは基本的にハード的な動きを起点に発動させることが多いです。そしてそのハードは「割り込みコントローラー」というものに接続され、コントローラーでハードの動きが検出されれば、CPUに通知して、対応した割り込みハンドラを実行します。
先程も挙げましたArduino Uno3であればタイマーや2番ピンが割り込みコントローラーに接続されています。そして2番ピンがHIGH→LOWに変化すると(※)コントローラーが割り込みを検出するのです。
※設定次第でLOW→HIGHなどにもできます
ベクターテーブルとは
割り込みが発生した時にどの関数(割り込みハンドラ)を実施するかを記載したテーブルです。
ここに関数名が書かれているので、割り込みの種類に対応した関数名を参照し、その関数名で機能を実装します。
例えばSTM32マイコンで、ピンに接続されたボタンが押下されたら割り込みハンドラを実施したい場合はEXTI0_IRQHandlerという関数名で機能を追加すればよいのです。
ベクターテーブルはマイコンごとに規定されているファイルは異なりますが、STM32ではstartup_stm32f4xx.sというファイル内で規定されています。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
.syntax unified .section .isr_vector,"a",%progbits .type g_pfnVectors, %object .size g_pfnVectors, .-g_pfnVectors g_pfnVectors: .word _estack // 初期SP値(スタックポインタ) .word Reset_Handler // リセット割り込み .word NMI_Handler // NMI割り込み // 外部割り込み(IRQ)ベクタ .word EXTI0_IRQHandler // 外部割り込み0 .word EXTI1_IRQHandler // 外部割り込み1 |
以上が割り込みハンドラとベクターテーブルの解説でした。
割り込みハンドラが何か? ベクターテーブルとは何か? をひとつひとつ明確に定義していけばそんなに難しいことはなかったですよね。
組み込み系はやっていることは単純でも説明が難しくてよく分からないことがあるので、今後もそういったシステムを簡単に説明していきます!