トロンフォーラム

第10回 割込み管理機能

これまでは、T-Kernelの割込み管理機能の使い方を中心に、サンプルプログラムを交えて説明してきました。ここでは、割込みハンドラがシステムの中でどのように管理されているか説明します。

割込みベクタテーブル

割込みベクタテーブルとは、割込みの要因ごとに割込みハンドラに関する情報を登録するテーブルです。割込みベクタテーブルの内容は、割込みハンドラの先頭アドレスや割込みハンドラへの分岐命令などです。tk_def_int で登録された割込みハンドラは、この割込みベクタテーブルに設定されます。

T-Engineリファレンスボードでは以下のようなベクタテーブルを実装しています。

図6 ベクタテーブル

図6 ベクタテーブル

割込みハンドラが呼ばれるまで

それでは、tk_def_intで登録された割込みハンドラが実際に呼ばれるまでの流れを見てみましょう。ここでは、T-Engineリファレンスボード(tef_em1d)上でのT-Kernel 2.0の動作を説明します。

T-EngineリファレンスボートにはARM11が搭載されています。ARM11の割込み処理では、各割込み要因に対応する割込みハンドラへの分岐をソフトウェアが行います。

  1. 周辺機器から割込み信号が入力されると、割込みコントローラがCPUに割込み要求を通知します。
  2. 割込み要求がCPUに通知されると、CPUの例外ベクタから割込みエントリルーチンへ分岐します。
  3. 割込みエントリルーチンは、割込みコントローラの状態から割込み要因を特定し、割込みベクタテーブルを用いて対応する割込みハンドラへ分岐します。
  4. 割込みハンドラが高級言語で記述されている場合、いったん高級言語対応ルーチンを経由してC言語の関数呼び出しのレジスタ規則に合わせてから、C言語で書かれた割込みハンドラが呼び出されます。
  5. C言語で記述された割込みハンドラがreturn文で終了すると、高級言語対応ルーチンに復帰して、その中のtk_ret_intが呼び出されます。これによって割込みハンドラから復帰するとともに、遅延されていたディスパッチが処理されます。

上記手順の中で1,2はハードウェアで、3,4,5はソフトウェアで処理されます。

図7 割込み処理の流れ

図7 割込み処理の流れ

なお、ARMの例外処理の詳細については、APS ACADEMY Cortex-M入門編「第13回 例外/割り込み処理」が参考になります。

割込みハンドラ番号と割込みベクタ

最後に、T-Kernelの割込み管理機能における割込みの指定方法に関する説明をします。

割込みの指定方法は、システムコールとそれ以外で異なります。システムコールでは割込みハンドラ番号を用いて割込みを指定し、ライブラリ関数やマクロでは割込みベクタを用いて割込みを指定します。

システムコール(tk_def_int)は割込みハンドラ番号を用いて割込みを指定し、1つの割込みハンドラ番号に対して1つの割込みハンドラを定義できます。割込みハンドラ番号は複数の割込みハンドラを区別するための番号です。その具体的な意味は実装ごとに定義されます。一般には、CPUハードウェアの割込み処理で定義される割込みベクタをそのまま使うか、割込みベクタとの対応付けが可能な何らかの番号を使います。割込みベクタから割込みハンドラ番号を得るには、DINTNOマクロを利用します。

ただし、T-Engineリファレンスボードでは、割込みハンドラ番号として割込みベクタをそのまま用います。そのため、DINTNOマクロは以下のように定義されており、そのままの値を返すようになっています。

まとめ

応答性の高いリアルタイムシステムを構築するためには、割込みによる処理は避けては通れません。しかし、一般的に割込みに関する機能はハードウェアに強く依存するために実装が難しく、有効に活用するにはハードウェアとソフトウェアの両方に関する知識が必要です。

T-Kernelを利用することで、ユーザーが割込み処理の実装にかける手間を減らすことができます。実際、サンプルプログラムのように、割込みハンドラ番号や割込みモードなどの一部を除けば、T-Kernel APIと標準的なC言語で割込み処理を記述することが可能です。そのため、移植性の高いソフトウェアを開発することができます。

また、タスクと割込みを複数使用する場合は、処理の流れが複雑になりがちです。しかし、T-Kernelの割込みハンドラの処理に関する適切な制約と遅延ディスパッチの原則により、処理の優先度が明確になり、ユーザーが期待した処理を実現しやすくなります。

ぜひ、T-Kernelの機能を有効に活用してリアルタイム性の高いシステムを構築してください。

第9回 タスク間同期・通信機能1第11回 タスク間同期・通信機能3

Return Top