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

koizumi yoshiyuki koizumiyoshiyuki @ gmail.com
2011年 1月 11日 (火) 09:13:19 JST


 こいさんです

 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* レジスタのソフトウェア割り込みが最初だったとおもいます。
 デバッグを開始すると様々な問題が出るとは思いますが、入り口を間違えると無駄な作業をする羽目になるので先人のお知恵を借りたいと思っています。
 よろしくお願いします。


以上
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://www.toppers.jp/pipermail/users/attachments/20110111/817626d4/attachment.html>