(toppers-users 469) Re: TOPPERS/JSP の実装で教えてください。

TAKADA Hiroaki hiro @ ertl.ics.tut.ac.jp
2002年 8月 12日 (月) 22:05:03 JST


タイミング遅れのフォローで申し訳ありません。おおよそのところは若林君が
答えてくれていますので、2点だけ補足します。

松川さん wrote:
> [質問1]
> 既に移植されている他の機種の実装と比べてみると、以下の点が大きく異なっ
> ています。
>  (1) tcb->tskctxbにPCが含まれている。
>  (2) タスクの起動時の処理(主にスタックの初期化)をacrivate_r()という
>      関数に分けられている。
> SPが復元できれば、PC(戻り番地)は復元出来るように思えるのですが、このよ
> うに実装されているのには、何か理由、利点があるのでしょうか。

ご指摘の通り、PC を TCB に保存する必然性はほとんどなく、スタック上に保
存しても差し支えありません。あえて言えば、(これも若林君が書いています
が)、TCB のサイズが 32バイトになるのは、多くのプロセッサで都合が良いは
ずです。PC を TCB から外して 28バイトにすると、実行効率・コードサイズ
の点で不利になると思います。

それから、これもすでにお気付きと思いますが、PC の値として実際に保存さ
れるのは3種類の値しかありません (私もすべてのプロセッサの依存部を見た
わけではないので、プロセッサへの移植方法によっては、これがあてはまらな
いものもあるかもしれません)。よって、本当にメモリを節約したければ、32
ビットはムダで、3ビットあれば良いことになります。TCB の中にビットフィー
ルドで押し込めば、さらにメモリが節約できることになります (代わりに速度
が遅くなりそうなので、採用はしていません)。

> [質問5]
> 割り込み処理のオーバーヘッドを減らすために、ディスパッチに最も優先度の
> 低いハードウェア割り込みを使用できないか検討しています。現在のカーネル
> で変数reqflg=TRUEとしているところで割り込み要求ONとすることで、他の全
> ての割り込みから抜けたところで自動的にディスパッチするようにできるので
> はないかと考えています。(利点:割り込みハンドラ前後のカーネルの介入が
> 全く不要になる&大部分のサービスコールixxx_yyyとxxx_yyyが共通にできる)
> この方式での問題点や、なにか注意すべき点がありましたらご指摘下さい。

JSP の実装では、少なくとも、サービスコールの中での明示的なディスパッチャ
呼び出し (dispatch) の中で、タスクが切り替わる必要があります。割込みに
ついては、おっしゃるような方法は可能と思いますが、ixxx_yyy と xxx_yyy 
は共通にはならないと思われます。この制約は、具体的には、エラーコードの
取り出し方に関係します。

例えば、slp_tsk のコード

----------------------------------------
        t_lock_cpu();
        if (runtsk->wupcnt) {
                runtsk->wupcnt = FALSE;
                ercd = E_OK;
        }
        else {
                runtsk->tstat = (TS_WAITING | TS_WAIT_SLEEP);
                make_wait(&winfo);
                dispatch();
                ercd = winfo.wercd;
        }
        t_unlock_cpu();
----------------------------------------

の中で、もし t_unlock_cpu のところでタスクが切り替えられるとすると、
ercd に正しいエラーコードが取り出せません。

それから、上の方法は、タスク切替えが要求されなかった場合の割込み処理オー
バヘッドは減りますが、一方で、タスク切替えのオーバヘッドは増加します。
ディスパッチのために、余計な割込みが1つ必要だからです。多くのプロセッ
サで、割込みに出入りするオーバヘッドは結構大きいと思いますので、これは
かなり痛いはずです。その割に、タスク切替えが要求されなかった場合の割込
み処理オーバヘッドの現象はわずかだと思います。

以上は定性的に考えただけですので、実際のプロセッサで計測してみるのが本
道だと思います。

高田広章
豊橋技術科学大学