スタックと割り込み ―― プログラムが動く仕組みを知ろう

大山将城

tag: 組み込み

技術解説 2008年7月23日

3.割り込みとは何か

 続いて,割り込みについて説明します.割り込みは「実行の流れを切り替えるための仕組み」です.ここまで,実行の流れはプログラム・カウンタの制御で実現し,関数呼び出しと関数リターンはスタックを利用して実現することを説明しました.では,割り込みによる実行の流れの切り替えは,どのようになっているのでしょう.

● 割り込みの実行の流れ

 割り込みを説明するために,図9に示すプログラムについて考えてみます.図9のプログラムはwhileの無限ループの中に「ボタン入力に対する処理」と「たくさん実行したい処理」で構成されています.「ボタン入力に対する処理」は,ボタン入力があれば処理を行い,なければ何も行いません.このプログラムを実行すると「ボタン入力に対する処理」と「たくさん実行したい処理」を繰り返します.ボタン入力がなければ"ボタン入力に対する処理"は必要がないので,CPUの処理時間をロスします注7

注7;「ボタン入力があった場合に行う処理」は毎回行われるわけではないが,「ボタン入力があったかどうかを確認する処理」は毎回行われる.ここでは,その確認処理にかかる時間をロスであると言っている.

zu09_01.gif
図9 ボタン入力に対する処理を含むプログラム
「ボタン入力に対する処理」を実施するかどうかの確認をループが回るたびに行うことになるので,効率が悪い.

 次に,「ボタン入力に対する処理」を関数化して,「たくさん実行したい処理」のみをwhileの無限ループの中で実行する形に変更したプログラムが図10です.これなら,通常は「たくさん実行したい処理」のみを実行します.では,「ボタン入力に対する処理」はいつ呼び出されるのが妥当でしょうか? もちろん,ボタン入力が発生したときです.ボタン入力の発生をきっかけに,ボタン入力に対して処理を行う関数Button_Handlerを呼び出すのが適切です.このようなとき,実行の流れを切り替えるきっかけを「割り込み要因」と言います.この例では,ボタン入力が割り込み要因です.割り込み要因と対応した処理の呼び出しを結び付ける仕組みが「割り込み」です.

zu10_01.gif
図10 ボタン入力に対する処理を関数化したプログラム
「ボタン入力に対する処理」を別の関数として切り出し,ボタンが押されたときだけ,この関数を呼び出すようにした.

 割り込み要因はいろいろあります.主な割り込み要因注8としては,入出力装置のリクエストや,算術演算のオーバフロー/アンダフロー,メモリ・アクセス,ミス・アラインメント,メモリ保護違反,未定義命令の検出などが挙げられます.

注8;割り込みは,ハードウェア的に発生するハードウェア割り込みと,ソフトウェア的に発生するソフトウェア割り込みに大別される.さらにソフトウェア割り込みは,性質によって「トラップ」,「フォールト」,「アボート」と呼ぶこともある.本稿では話を簡単にするため,すべて割り込みと表記している.

 割り込みは,「命令実行の流れを変える」という点では,関数呼び出しと同じであると言えます.プログラム中から意図的に呼び出すのが関数呼び出しで,主にハードウェア要因によってプログラムの流れとは非同期に呼び出されるのが割り込みです.割り込みが発生したら,プログラム・カウンタに割り込みに対応した処理を行う関数(これを「割り込みハンドラ」という)の先頭アドレスを設定し,戻り先アドレスをスタックに格納します.割り込みハンドラの先頭アドレスは割り込みベクタと呼ばれ,割り込み要因ごとの割り込みベクタを格納した割り込みベクタ・テーブルから読み出します注9

注9;割り込みベクタ・テーブルには,割り込みハンドラの先頭アドレスであるベクタ・アドレスを格納するものや,割り込みハンドラへのジャンプ命令などを格納するものがある.

 割り込みハンドラへ実行を切り替える例として,先のボタン入力を割り込み要因とする例を考えてみましょう.ボタン入力の発生に対して,戻り先アドレスとして実行中の命令の次の命令のアドレスをスタックに保存することと,プログラム・カウンタの値を割り込みハンドラButton_Handlerの先頭アドレスに更新することで,割り込み処理が実現できそうです(図11)

 確かに,割り込みハンドラに実行を切り替えるだけならこれでよいのですが,実はそれだけでは不十分なのです.では,ほかに何が必要なのでしょうか.割り込みと関数呼び出しの違いから考えてみましょう.

組み込みキャッチアップ

お知らせ 一覧を見る

『FPGAマガジン No.4』,書店とWebで好評発売中! ダウンロード版(PDF)も!

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る

Rochester Electronics,ルネサス エレクトロニクスの保守供給終了製品を同社に代わって提供

福岡県Ruby・コンテンツビジネス振興会議と福岡県,秋葉原にてmrubyの技術&ビジネス振興イベントを開催

u-blox,アンテナを内蔵したGPS/QZSSモジュールを開発

OTSL,自動車産業の機能安全規格に対応するためのファイル変換ツールを開発

Freescale,ウェアラブル製品向けのリファレンス・プラットフォームを開発,オープン・ソースで提供

Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

ET2013でDevice2Cloudコンテスト優勝チームが堂々展示

2013年11月25日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日