割り込みハンドラ

Home > 2005-07 / 実装技術 > This Entry [com : 0][Tb : 0]

2005-07-29

 C++だけでなく、Cの場合も割り込みハンドラを記述するための標準的な方法はありません。通常は、関数定義の際に割り込みハンドラを指定するためのinterruptのような独自拡張のキーワードを使うか、#pragmaを使って割り込みハンドラを作るかと思います。

μITRONでは、割り込みハンドラだけでなく、CPU例外ハンドラや周期ハンドラ等について、標準的な記述方法が(緩くではありますが)定められています。また、類似のものとしては、タスクコンテキストで呼び出されるタスク例外処理ルーチンというものもあります。

さて、今回の記事では、こうした割り込みハンドラやその類似のものをC++で記述する方法について書いてみたいと思います。

 標準C++では、(主にJava等の言語との比較において)マルチタスクとGUIに関する規定がないことをよく指摘されます。実際には、割り込みハンドラの記述方法も規定されていないのですが、Javaも同様であることから、あまり指摘されていないようです。

割り込みハンドラについての規定はありませんが、最も近い概念として、シグナル処理ルーチン*1に関する記述はあります。以下はその内容を規格から引用したものです。

 CとC++の共通部分集合は, 適格なC++プログラム及び適格なCプログラムの両方に現れることのできる宣言, 定義, 式から構成される。C互換関数(POF:plain old function)とは, 共通部分集合の機能だけを使用した関数であって, 直接にも間接にもC互換型以外の関数を使用しないものとする。すべてのシグナル処理ルーチンは, C結合をもたなければならない。C標準に適合するCプログラムでシグナル処理ルーチンとして使うことのできるC互換関数は, C++プログラムでシグナル処理ルーチンとして使った場合に動作が未定義となってはならない。C++プログラムのシグナル処理ルーチンとしてたの関数を使った場合の動作は, 処理系定義とする。



要するに、シグナル処理ルーチンは必ずC結合*2でなければならず、確実に動作するのはCと同じように書いた関数だけだということです。

C互換型以外については処理系定義ですが、処理系が定義してくれるのはシグナル処理ルーチンについてであって、割り込みハンドラについてではありません。結果として、割り込みハンドラは、C結合でC互換型でなければならないことを意味します。

もっとも、処理系というのは実行環境も含めてのことですから、組み込みの場合、ソフトウェア開発者自身が"処理系による定義"を行うことはできると思います。その場合の動作保証は自らの手で行うことになります。


*1 signal関数で登録されるコールバック関数
*2 extern "C"を用いて宣言された外部結合

Comment

Post a Comment









管理者にだけ表示を許可

Trackback

http://cppemb.blog17.fc2.com/tb.php/14-de936a79

C++と組み込み環境 | Page Top▲

New >>
コールバック
<< old
インライン関数再考
ブログ内検索
RSSフィード