管理外割り込み対応
よく考えたら管理外割り込みをどう使うのかきちんと書いてませんでした。
例えばIVG8を管理外割り込みとして使用するときにはboard_config.hに
#define UNMANAGED_INT 0x0100
と書きます。これは以前ちょっと説明したとおりです(マクロ名が変わっています)。そしてIVG8のイベント・テーブルにはユーザーが定義した割り込みハンドラを直接登録します。TOPPERS/JSP for Blackfinからは、その登録方法を提供しません。割り込みからのリターンは単にrti命令を実行します*1。これはうじのすけさんによる実装と同じ方式ですね。
さて、start.asmの管理外割り込み対応部は次のようになっています。
cli r0; // 現在のCPUロック状態を取得 [--sp] = r0; // ロック状態を退避 r1 = 0xC01F(z); // タスクコンテキストははCPUロック状態で実行する #ifdef UNMANAGED_INT r2 = UNMANAGED_INT(z); r0 = r0 & r2; // 管理外割り込みのマスク状態を抽出 r1 = r0 | r1; // タスクコンテキストはCPUロック状態で実行する #endif sti r1; // CPUロック状態 (B)
これはCPUロック状態に変更する部分のコードです。UNMANAGED_INTが定義されていなければ、0xC01FがIMASKにセットされます。しかし、UNMANAGED_INTが定義されている場合には該当する割り込み順位のマスク状態をcli命令の結果から抽出して、そのビットを変えないような新たなIMASK値を作り出しています。
たった今、この修正でstart.asmにバグがまぎれこんだことを発見(^^;。管理外割り込みを使うときにのみ発現するバグです。チェックした後コードの整形時に紛れ込んでしまってました。とりあえず
- リリース1.2でしか発生しない。
- 管理以外割り込みを使わなければ発生しない。
- 管理外割り込みは実験的実装である。
ということで、新たなリリースは出さずバグ・フィックスだけやってCVSにアップロードしておきました。
*1:そういう関数を作るためのプラグマが存在します