(toppers-users 3365) Re: Cortex-Mへの移植でDispatchまわりに質問があります。

Hiroaki TAKADA hiro @ ertl.jp
2011年 1月 12日 (水) 16:52:30 JST


こいさん

Cortex-Mに関する知識はないのですが、PendSVについては、基本的には、昔、
トロン仕様マイクロプロセッサに実装されていた遅延割込みと同じという理
解で回答させていただきます。

ちなみに、TOPPERS/JSPの前身であるItIsは、遅延割込みを使って実装して
ありましたので、それに戻すというイメージかと思います。

1.アイドルタスクを用いた実装について

アイドルタスクを用意して、ディスパッチャ内のアイドル処理を省くことは
可能です。

留意点としては、アイドルタスクを置くために最低優先度が使えなくなるこ
と(特別な優先度にすればこの問題はありませんが、ターゲット非依存部の
改造が大きくなるかと思います)、アイドルタスクに対してsus_tsk等が発
行されるとおかしなことになること(アイドルタスクに特殊なID番号を割り
付けて、サービスコールによる操作ができないようにする方が安全でしょ
う)、アイドルタスクのスタック領域の確保方法を用意する必要があること、
くらいでしょうか。

2.待ち解除時の返値について

ご指摘の通り、winfo.wercdを使って返値を渡すことができなくなります。
ItIsでは、ercdへのポインタをwinfoに入れるというアプローチを取って
いました(厳密には、winfoではなくTCBですが)。このアプローチであれ
ば、それほどターゲットプロセッサに依存しません。

他にこのような場所は、例えば wai_flg の中で flgptn を受け取る場所
など、いくつかあります。"winfo_" をサーチすれば、あたりがつけられ
ると思います。

3.他のTOPPERSカーネルについて

これに関しては、迂闊なことを言うとご迷惑をおかけする気がするので、
現時点では未検討という回答とさせてください。

高田広章
名古屋大学

(11/01/11 9:13), koizumi yoshiyuki wrote:
>  こいさんです
>  TOPPERS/ASPをCortex-M移植するための検討を行ってきました 
> (asp_arch_arm_m_gcc-1.3.2.tar.gz 
> <http://www.toppers.jp/download.cgi/asp_arch_arm_m_gcc-1.3.2.tar.gz>とは 
> 異りPendSVを使った実装を考えている)。概ねめどが立ち、ソースの修正を行え 
> るレベルになりました、が、基本的な事項で質問があります。
> 1 IDLタスクの実装について
>  現状IDLEタスクはasp\arch\arm_m_gcc\prc_support.Sのディスパッチャ内で、 
> 次に実行すべきタスクない(p_schedtsk==0)時にloopする処理として実装され 
> ています。
>  DILEタスクを通常のタスクとして実装し最も低い優先度(特別な優先度にする 
> ことも可能)としてディパッチさせても構わないでしょうか? asp\arch 
> \arm_m_gcc\prc_design.txtに上記の実装にした経緯が書かれえていますが、私 
> には判断できずに居ります。PendSVを使って同様な実装は可能ですが、PendSVの 
> 割り込みレベルでIDLE Loopが動作するので、この割り込みレベルが他の目的で 
> 使えなくなってしまうのを避けたいのです。WIFは非特権モードでも動作できる 
> で制約にはならないと思っています。必要ならタスク化したIDLEタスクからSVC 
> での特権モードのサービスの追加を考えています。
> 2 タスクが待ち状態から解除になった時の戻り値の処理について
>  たとえばtslp_tskの場合、現状ではdispatch()でタスクが切り替わりますが、 
> 遅延ディスパッチの実装ではdispatch()ではPendSV割り込みを発生させるだけで 
> 実際のディパッチはt_unlock_cpu()まで待たされます。(TOPPERS/ASPでは有り 
> 得ないのかも知れませんが、tslp_tskが割り込み禁止で実行されると、更に前の 
> 割り込み禁止が解除されるまで待たされることになります。これが遅延ディパッ 
> チの本領ですね)
>  現状の実装のercd = winfo.wercdでは戻り値が戻せなくなります。PendSVの実 
> 装ではスタックに保存されているR0レジスタに戻り値を直接書き込む必要があり 
> ます。他のこのような場所を探すにはどうすればよいのでしょうか。このような 
> 場合の戻り値の処理は必ずwinfo.wercdが使われていると考えてよいのでしょう 
> か。(TOPPERS/ASPのAPIの詳細を全て理解すればよいのでしょうが、少々辛いで 
> すね)
> 3 今はTOPPERS/ASPを前提に考えていますが、他のTOPPERSを考えるとき、上記 
> 1,2はどのように考えればよいのでしょうか?
>   保護モードのTOPPERSには興味がありますが、ASP以外は見たことがありません。
>   余談ですがタスク毎にメモリ空間を分離させるにはどうすればよいのか解か 
> らすにいます。この辺が入門でしょうかね。
>  遅延ディパッチはMIPSアーキテクチャで採用された*Cause* レジスタのソフト 
> ウェア割り込みが最初だったとおもいます。
>  デバッグを開始すると様々な問題が出るとは思いますが、入り口を間違えると 
> 無駄な作業をする羽目になるので先人のお知恵を借りたいと思っています。
>  よろしくお願いします。
> 以上
>