(toppers-users 3270) Cortex-M3のディスパッチをPendSVに変更したいと思っています
koizumi yoshiyuki
koizumiyoshiyuki @ gmail.com
2010年 11月 1日 (月) 16:27:59 JST
こいさんです。
小生、Cortex−M3版のTOPPERSを動作させています。TOPPERSは最新版1.6。個別パッケージはARM
Cortex-M3アーキテクチャ・GCC依存部パッケージ(担当:(株)未来技術研究所)を使用しています。
オリジナルの割り込みやディスパッチはCortex−M3の機能を有効に使用しているようには見えません(横取り割り込み、PendSV、ハンドラ/スレッドモード、MSP,PSPなど)。ARM7TDM仕組みのままCortex−M3上で無理やり動作させているように見えます。
Cortex−M3用の割り込みハンドラやPendSVを使ったディスパッチ、タスク切り替えの評価プログラムは動作しています。(適当に作ったμITRONもどきでタスク制御とタイマ割り込みは動作確認済み)
試作した仕組みをTOPPERSで試して見たいと思っていますが、簡単には出来そうも有りません。
net情報の「リアルタイムOSの内部をみてみよう!」も読みましたが、特定のチップの仕組みを説明してように見えます。OSのディスパッチャはPendSVのような(新しい?)仕組みで動作させるほうが素直であり、「リアルタイムOSの内部をみてみよう!」はレガシーなやり方のように感じています。
たとえば、スリープタスクは以下のようになっていますが
t_lock_cpu();
if (p_runtsk->wupque) {
p_runtsk->wupque = false;
ercd = E_OK;
}
else if (tmout == TMO_POL) {
ercd = E_TMOUT;
}
else {
p_runtsk->tstat = (TS_WAITING | TS_WAIT_SLP);
make_wait_tmout(&winfo, &tmevtb, tmout);
LOG_TSKSTAT(p_runtsk);
dispatch();
ercd = winfo.wercd;
}
t_unlock_cpu();
TOPPERS/ASPではdispatch();でタスク切り替えが発生することを前提にします(?)が、PendSVを使った実装では、実際にタスク切り替えが発生するのはt_unlock_cpu();まで待たされます。この為、スリープタスクの戻り値はdispatch();直後には定まっていないので、関数の戻り値が上手く伝えることが出来ません。t_unlock_cpu();の戻り値でせばいのですが、少々トリッキ(?)な手法が必要になるかも知れません。
現状のCortex-M3の実装では、割り込み回りは重すぎると思っています。
こんな話を、ここでしても良いのでしょうか?
どなたか別途、ご相談できればと思っています。
以上