(toppers-users 479) 非タスクコンテキストでのサービスコールの遅延実行

Tatsuhiko Matsukawa KFC00725 @ nifty.ne.jp
2002年 8月 20日 (火) 09:16:58 JST


お世話になります。

その後、サービスコールの遅延実行について検討してみましたが、割り込み禁
止区間を短くするのに、かなり効果があるようですね。
具体的には、以下のような実装を検討しています。

(A) 遅延実行するサービスコールの記憶には固定サイズのリングバッファを用
いる。遅延実行を必要とするサービスコールは最大でも2個のパラメータで、
かつ、Xstormy16の場合何れも16bitなので、
FP _kernel_delayed_svc_function[MAX_DELAYED_SVC] ; //遅延実行する関数
VP_INT _kernel_delayed_svc_paramater1[MAX_DELAYED_SVC] ; // 第一パラメータ
VP_INT _kernel_delayed_svc_paramater2[MAX_DELAYED_SVC] ; // 第二パラメータ
UINT _kernel_delyed_svc_put_pointer ; // リングバッファへの書き込みポインタ
UINT _kernel_delyed_svc_get_pointer ; // リングバッファの読み出しポインタ
となります。
MAX_DELAYED_SVCをどう決定するかが悩めるところですが、2の階乗にしてお
いたほうが処理が楽なので、16か32あたりで固定(それ以上が必要ならユーザ
ーカーネルをリコンパイル)にしてしまうか、コンフィグレータを拡張してユ
ーザが指定できるようにするか、今後の検討課題です。

(B) 遅延実行を行うタイミングの決定には、最も優先度の低い割り込みを用い
ます。非タスクコンテキスト(すなわちこれより優先度の高い割り込み処理中)
中は、優先度の低い割り込みは遅延されます。また、タスクコンテキストから
のサービスコールで不可分性を保証する必要のある部分(現行、t_lock_cpu/
t_unlock_cpuで囲まれた部分)では、この遅延実行のための割り込みのみを禁止
します。

(C) 非タスクコンテキストからのixxx_yyyの呼び出しは、以下の手順となりま
す。
  (1) パラメータ等をチェックし、不正ならエラーを返す。
  (2) リングバッファーに空きがあるか調べ、なければE_NOMEMを返す。
  (3) _kernel_delayed_svc_put_pointerを1進めて、
  (4) 呼び出す関数、パラメータをリングバッファに記録。
  (5) 遅延実行用の割り込み要求をセットする
  (6) E_OKを返す。
この中で、(2)-(3)の区間だけは割り込み禁止にしなければなりませんが、こ
れぐらいであれば、「カーネルの管理外の割り込み」を実装する必要もなさそ
うです。

(D) 遅延実行用の割り込みでは、
  (1) 割り込み要求をクリアする
  (2) 記憶されたサービスコールを順次全て実行(ただしdispatch()のかわり
      にreqflg=TRUE)
  (3) 現行の割り込みハンドラの後処理と同様に、reqflgやタスク例外要求等
      をチェックし、必要ならディスパッチする。


非タスクコンテキストからのサービスコールを遅延実行にすることで、カーネ
ル内で割り込み禁止にする必要が残るのは、
  (1) 上記、リングバッファー書き込みポインタのインクリメント時。
  (2) 割り込みハンドラ前後のintnest=0→1→0とタスク用スタック/システム用
      スタックの切り替え時。
の2箇所のみになると思われるのですが、見落としが無いかは、今後じっくり
調べてみます。


非タスクコンテキストからのサービスコールを遅延実行にすることで、ITRON
のサービスコール以外のクリチカルセクションを持つ関数(malloc等)も、全割
り込み禁止やセマフォー等を用いることなく、簡単にスレッドセーフに実装す
ることができるという利点があります。
遅延実行のために割り込みを用いることによるオーバーヘッドもありますが、
Xstormy16の場合、割り込みサイクルの発生は3クロック、レジスタのPUSH/POP
は1クロックで行えるので、割り込み禁止時間の短縮のメリットから比べれば
目を瞑れる範囲ではないかと考えています。


  松川竜彦




************************
松川竜彦
KFC00725 @ nifty.ne.jp
************************

----- Original Message -----
From: "Tatsuhiko Matsukawa" <KFC00725 @ nifty.ne.jp>
To: <toppers-users @ ertl.jp>
Sent: Tuesday, August 13, 2002 1:50 PM
Subject: (toppers-users 476) Re: TOPPERS/JSP の実装で教えてください。


> > > ご指摘の点は、カーネル設計上の大きな分岐点でして、割込み応答性が
> >      : 中略
> > > い標準化」の考え方を採っている理由です)。
> > ご意見ありがとうございます。検討してみます。
> > (遅延実行するサービスコールのキューイング等、
> > かなり大変そうですね。)
> と思ったのですが、キューイングできる数を現実的な
> ところで制限していしまい、固定のキューバッファに
> すれば、それほど大変ではなさそうですね。
>

** Cut quoted 9 lines by the mail filter. **