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

Tatsuhiko Matsukawa KFC00725 @ nifty.ne.jp
2002年 8月 5日 (月) 19:55:23 JST


初めてこのメーリングリストに参加します、松川と言います。
よろしくお願いいたします。
今回、はじめてITRONに触っていますので、知らないことばかりで、いろいろ
おかしな質問をすることもあるかと思いますが、ご容赦下さい。


現在、三洋電機のXstormy16というコア(主な特徴は文末参照)にμITRONの使用
を検討しているのですが、その調査と実験を兼ねてとりあえずTOPPERS/JSPを
移植しています。(最終的にTOPPERSを用いるか、他を用いるか、あるいはスク
ラッチから作成するかは未定です。)
ある程度動くものはできたのですが、その中でいくつか疑問な点がありますの
で、質問させていただきます。
アドバイス、コメント等いただければ幸いです。


「dispatch関連」
現在、とりあえず、以下のように実装しています。
    [tcb->tskctxb構造体のメンバー]
      SPのみ
    [dispatch()関数]
      (0) この関数が呼ばれた時点でここからの戻り番地(待ちに入るタスク
          が再び再開するときの開始番地)は既にスタックに積まれている。
      (1) 全レジスタ(含むPSW/除くSP)をスタックにPUSH
      (2) PUSH後のSPをruntask->tskctxb.spに保存
      (schedtask!=NULLなら)
      (3) schedtask->tskctxb.spからSPを取り出す。
      (4) (1)と逆順で全レジスタをPOP
      (5) return
    [exit_and_dispatch()関数]
      上記dispatch()の(3)以降と同様
    [create_context()/activate_context()関数]
      (1) スタック一番底にext_tsk (タスクからreturnした時のため)
      (2) スタック2番目にタスク開始番地(上記dispatch()の(5)でタスク頭に)
      (3) スタックその上に全レジスタ(exinfはレジスタ渡し。PSWの割り込
          み許可ビットON)の初期値
      (4) (1)-(3)を積んだ後のSPのアドレスをtcb->tskctxb.spへ保存
としています。
[質問1]
既に移植されている他の機種の実装と比べてみると、以下の点が大きく異なっ
ています。
 (1) tcb->tskctxbにPCが含まれている。
 (2) タスクの起動時の処理(主にスタックの初期化)をacrivate_r()という
     関数に分けられている。
SPが復元できれば、PC(戻り番地)は復元出来るように思えるのですが、このよ
うに実装されているのには、何か理由、利点があるのでしょうか。
[質問2]
(割り込みハンドラからの遅延ディスパッチを除き)dispatch()/exit_and_dispatch()
関数はCで記述したカーネルからCの関数として呼ばれると思うのですが、この時、
Cの仕様として関数の呼び出し前後で変わっても良いレジスタは保存しなくて
もいいのでしょうか。(現在は安全のため全レジスタを保存しています)

「スタック関連」
[質問3]
各タスク用のスタック以外に、CPUのリセットから、crt0/kernel_start()/
exit_and_dispatch()までの間に使用する初期のスタックエリアがありますが、
このエリアはkernel_start()からexit_and_dispatch()が呼ばれて以降は使用
されることは無いと考えていいのでしょうか。(無いなら、exit_and_dispatch()
が呼ばれた時点までで使用されている部分も含めて、非タスク部用のスタック
か、あるいは他の用途に使えるのではないかと考えています。)

「システムクロックドライバ関連」
[質問4]
dly_tsk()等を使用するときの時間管理関係のカーネルの一部の処理が、systask
というところに分けられ、これを使用するには、ユーザプログラムのコンフィ
グレーションファイルから"timer.cfg"を明示的にインクルードする必要があ
るようですが、このような構成には理由、利点があるのでしょうか?
(kernel_startの中で、hw_timer_initialize()とdefine_inh(INHNO_TIMER,
 _kernel_timer_handler)を呼ぶだけでいいような・・)

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


以上、いきなり沢山の質問で申し訳ありませんが、よろしくお願いいたします。

                              松川 竜彦

============== 参考 : Xstormy16の主な特徴 =========================

まだ、ほとんど知られていないマイコンですので・・・・・

用途 : 主として組み込み用の16bitワンチップマイコン(小規模・ローコスト向け)
レジスタ : 16bit x 16本 R0-R15 ( 内、R14=PSW/R15=SP)
プログラムカウンタ : アーキテクチャ上は32bit(実装はROMサイズによる)
メモリ空間 : アーキテクチャ上は4GB使用可能。レジスタ2本を用いての4GB
             全空間へのアクセスもできるが、1本のみを用いての先頭64KB
             へのアクセスが効率が良く行えるので、
               0000H-7FFFH : RAM用(実際の製品では2KB前後の搭載が中心)
               8000H-      : ROM用(実際の製品では16-224KB前後の搭載)
             と配置することで、16bitでRAM/ROM両方のデータにアクセス可。
開発言語 : GCC移植済み(int=16bit/pointer=16bit)

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