(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)を実行
しても矛盾は発生しません(割込みが発生しなかった場合と同じ結果にな
ります)。