(toppers-users 356) Re: Toppers CPU ロック状態について

Takayuki WAKABAYASHI takayuki @ ertl.ics.tut.ac.jp
2002年 1月 30日 (水) 01:50:14 JST


豊橋技術科学大学の若林です。

さきにこちらから回答させていただきます。

Shigemitu Takata <takata @ kyoto-sr.co.jp>さんは書きました:
 >   Toppers の仕様では、
 > ***********************************************************************
 >   割り込みハンドラ入り口での CPU ロック状態は未定義(実装依存)だが、割
 > り込みハンドラが実行される時点では CPU ロックは解除状態でなければならな
 > い。
 > ***********************************************************************
 >   と考えるのですが、よろしいのでしょうか。

これは正しいです。

ここで言えるのは、
 ・出入り口処理は割込み禁止であるが、CPUロック状態であるとは限らない
 ・ハンドラ実行時は常にCPUロック解除状態 だが 割込み許可状態であるとは限らない
    #多重割込みを許可するなら 常に割込み許可状態
であるということです。
 #出入り口処理が割込み禁止というのはCPU依存ですが多くの場合そうでしょう

V850依存部では、「割込み禁止 = CPUロック」です。
割込み出入り口処理部では、もともと割込み禁止であるのと、
多重割込みで破壊されるレジスタがある関係上、割込み禁止状態です。
そのため、割込み出入り口処理部はCPUロック状態です。
多重割り込みをサポートする関係上、ハンドラを起動する直前で
割込み許可状態にしています。そのため、ハンドラ実行時点では
CPUロック解除状態になっています。

Windows依存部では、「フラグがたってる = CPUロック」です。
割込み出入り口処理部では、割込み要求元となったスレッドを
そのまま止め、割込みハンドラに当たるスレッドを起動するだけ
なので、CPUロックフラグを操作しません。そのため、割込み
出入り口処理部もハンドラ実行時もCPUロック解除状態です。
しかし、割込み要求を処理するスレッドが一つしかない関係上、
出入り口処理は割込み禁止であるようにみえます。

あくまでも
 ・CPUロック状態  = カーネルが管理している割込み/例外ハンドラ/タスクへの
                    ディスパッチ禁止
 ・割込み禁止状態 = CPUが管理している割込み/例外要求の受付拒否
であり、両者は独立だということです。

ですからCPUロック状態でカーネル内部の割込み/例外ハンドラが動いてしまっても、
ユーザの割込み/例外ハンドラ/タスクが起動しなければ問題ありません。
また管理外であると明記されていればユーザのハンドラが動いてしまってもOKです。
問題が起こってしまったとすれば、それはユーザ責任です。

--------
 >   割り込みビットがクリアされて、割り込みが不許可であっても CPU ロック状
 >   態であるとは限らない。        ^^^^^^^^^^^^^^^^

というのも正しいと思います。

たとえば多重割り込みを許可しない場合、割込みハンドラ実行中は
割込み全禁止状態のままにしておくのが一般的です。
 #不慮の事態に備えてマスクで対処する場合もあります

しかし、ここで「割込み禁止 = CPUロック状態」としてしまうと、
この割り込みハンドラ実行中は常にCPUロック状態だということになってしまい、
ほとんどのAPIが実行できません。
また、前の項目の「ハンドラ起動時はCPUロック解除状態であるべき」に反します。
 #V850依存部のテストのときにこの現象を体験しました

ここまで書いていて気づいたのですが、「割込み禁止 = CPUロック状態」という
実装で一番厄介なケースが割込みハンドラ内のソフトウェア例外要求です。
このとき、次のような状況が発生します。

 1. def_exc(TRAP_0, {TA_HLNG, trap_handler}) で ハンドラを登録
 2. def_int(xxx, {TA_HLNG, xxx_hander}) で割込みハンドラを登録
 3. xxx割込みが発生して、xxx_handlerが実行される
     << このとき、割込み許可 かつ CPUロック解除状態 >>
 4. loc_cpuを実行し、CPUロック状態へ
     << このとき、割込み禁止 かつ CPUロック状態 >>
 5. 「TRAP #0x0」を実行する
 6. 通常ソフトウェア例外はマスクできないので、要求は受理される
 7. trap_handlerが起動してしまう
     -> CPUロック状態なのにCPU例外ハンドラが起動できる

上記のようなケースの場合、TRAPでハンドラを起動する前に現在
CPUロック状態であるかどうかを判定し、CPUロック状態であれば
要求をペンディングするような仕組みを設けるか、
これらの例外をカーネルの管理外とするなどの対策法がありそうです。

利用頻度によると思いますが、個人的にはサポート外とするのが妥当だと思います。
 #関数呼び出しやタスク例外ではなく、
 #TRAPで起動しようとする意図がちょっと思いつきません

長文になってしまいましたが、以上 参考になれば幸いです。

//-------------------------------------------------
//Takayuki WAKABAYASHI (わかばやし たかゆき)
//  mailto: takayuki @ ertl.ics.tut.ac.jp
//-------------------------------------------------
//豊橋技術科学大学 工学研究科 情報工学専攻
//  組込みリアルタイムシステム研究室
//    Embedded and realtime system laboratory
//      Dept. of information and computer science
//        Toyohashi univ. of technology