(toppers-users 1946) Re: H8S、非タスクコンテキストでの割込みについて質問
ykominami
ykominami @ nifty.com
2005年 2月 19日 (土) 13:57:15 JST
二村様
小南です。
すでにH8/300Hのソースを調査され、割込み処理の変更に取り掛かって
おられることと思いますので、以下は参考までということでお願いします。
On Wed, 16 Feb 2005 13:24:26 +0900
二村誠示 <snimura @ icrl.mew.co.jp> wrote:
> >小南様
> > (B)割り込みモード1ではI,UIビットを割込処理で1に設定する必要
> > はないのではないでしょうか。
> >
> > 適切な値が設定されていれば、無駄な処理というだけですが、適
> > 切でない値が設定された場合は、バグの原因になりそうです。
>
> 明示的にI,UIビットを変更して割込み禁止にする必要は無いということ
> でしょうか。
> CPUにより自動的にI,UIビットが1にセットされるのであれば、
> 確かに無駄な処理ですね。一度確認してみます。
最初は「無駄な処理」ということしか思い付かなかったのですが、後で
考え直してみると、もっと重要な問題がありました。
H8Sの割込みモード1(H8/300H互換)では、CPUがI,UIビットを1に設定する
ため、CCRの値だけで判断する限り、常に割込み禁止(H8S依存部の実装
ではCPUロック状態)になります。
つまり、割込み発生前にJSPカーネルが明示的にCCRレジスタを操作して
割込み禁止状態にしようとしたのか、 しなかったのかの区別ができま
せん。
割込みモード2を用いたJSP1.4.1 H8S依存部では、CPUが自動的に割込み
マスクをかけないため、JSPカーネル側でEXRレジスタを保存して、後で
その内容から判断することができますが、割込みモード1では保存しよう
とした段階ですでにCPUが書き換えています。
したがって、なんらかの手段を用いて上記の区別を可能にするか、もし
くは区別をする必要を無くす工夫をしなければなりません。
それから[toppers-users:1942],[1944]にて「割込み禁止状態にするため
の過渡状態」が問題にされていますが、μITRON4.0仕様においては、
「CPUロック状態」が規定されているのであって、「割込み禁止状態」が
規定されているわけではないことに注意する必要がある思います。
「3.5.4 CPUロック状態」にて、「CPUロック状態では、カーネル管理外
の割込みを除くすべての割込みが禁止され、ディスパッチも起こらない」、
「割込みハンドラからのリターン直後はCPUロック解除状態になる」とさ
れていますが、その「補足説明」にて、「CPUロック解除状態であって
も、割込みが許可されているとは限らない」ともされています。
CHECK_INTCTX_UNL()をスキップするかしないかよりも、どうすれば「CPU
ロック状態」の実装上の具体的な定義に整合性を持たせられるかを考える
ほうがよいのではないかと思います。
今回の場合に当てはめれば、例えばCPUロック状態を「割込み禁止状態
+ロックフラグがON」と定義することも可能です。
ここでロックフラグはメモリ上に確保した変数で、ON、OFFの2値をとる
ものです。また割込みハンドラ入口処理にて、割込み発生前にJSPカーネル
が明示的にCPUロック状態にしようとしていたか否かを判断できるものと
仮定します。
#以下はCPUロック状態が割込み禁止状態とは独立した概念であることの
#説明であり、けっして正しい実装方法だというわけではありません。
#実装する場合には、下記以外にも考慮すべきことがあります。
(A)CPUロック状態にする方法
(1)割込み禁止状態にする
(2)ロックフラグをONにする
(B)CPUロック解除状態にする方法
(1)ロックフラグをOFFにする
(2)割込み禁止を解除する
(C)CPUロック状態の判定方法
(1)割込み禁止状態であり、かつロックフラグの値がONであれば、
CPUロック状態である
(2) (1)でなければCPUロック解除状態である。
具体的には以下のどれかである。
a)割込み可能である
b)割込み禁止であるが、ロックフラグがOFFである。
(D)割込みハンドラ入口処理
(1)ロックフラグの値を保存する。
(2)CPUロック状態にする時の過渡状態であるか否かを判定し、判定
結果を保存する。
(E)割込みハンドラ出口処理
(1)ロックフラグの値を復元する。
(2)割込みがCPUロック状態にする時の過渡状態で発生したのであれ
ば、割込み禁止状態にする。
上記の定義はμITRON 4.0仕様のCPUロック状態の規定を満たしています。
また[toppers-users:1911]のように割込み禁止の過渡状態で割込みが
発生しても、(A)-(2)が実行される前であるため、「CPUロック解除状態」
と判定されます。
割込みハンドラからリターンした直後は、割込み発生直前の状態に
なっている(割込み禁止状態、ロックフラグOFF)ため、(A)-(2)を実行
しても矛盾は発生しません(割込みが発生しなかった場合と同じ結果にな
ります)。