(toppers-users 3271) Re: Cortex-M3のディスパッチをPendSVに変更したいと思っています

Meika Sugimoto asuka.choronos @ gmail.com
2010年 11月 1日 (月) 16:55:45 JST


こいさんさま

杉本です.

まずカーネルの修正に関する話題については
ここで議論することは全く問題ないと思います.


本題のCortex-M3向けの改良ということですが,
引き合いに出されたslp_tskに関してそう思われるのは
当然ありうることだと思います.

ターゲット非依存部は,ある程度一般的なターゲットの構成を想定して
どのターゲットに対しても共通の実装で動作するように配慮されています.
実際,数多くあるASPの実装(CPU種別,MCU種別,コンパイラ種別の
組み合わせ)に対して極力変更なく動きます.

逆に言えば,個々のターゲットアーキテクチャにぴったりと
フィットするようにはなっていないということです.

それをターゲットアーキテクチャに合わせて変更することで
性能を引き出すということはもちろん可能です.

デメリットを上げておきますと,多くのターゲットで動いている
実績のあるコードを変更することになるため,検証を
念入りに行う必要があります.
カスタマイズすることのメリットとデメリットに関しては
常につきまとう問題ですので,ご注意ください.


(2010/11/01 16:27), koizumi yoshiyuki wrote:
>  こいさんです。
> 
>  小生、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の実装では、割り込み回りは重すぎると思っています。
> 
>  こんな話を、ここでしても良いのでしょうか?
>  どなたか別途、ご相談できればと思っています。
> 
> 以上