(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の実装では、割り込み回りは重すぎると思っています。

 こんな話を、ここでしても良いのでしょうか?
 どなたか別途、ご相談できればと思っています。

以上