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

koizumi yoshiyuki koizumiyoshiyuki @ gmail.com
2010年 11月 2日 (火) 13:56:28 JST


 杉本さま

 ありがとうございます。おおよその流れは見えてきました。私は間違っては見ないようですね。如何すればよいのか迷い、先ずはと、ここに書いてみた次第です。

 参照の例題はslp_tskでは無くtslp_tskです。tslp_tskでは解除の戻り値がタイムアウトとウエイクアップで異なります。slp_tskは寝てしまえば、起されるだけなので今のままでも良いと思っています(?)。
 TOPERSではデキスパッチャ部とtslp_tskを見て、チップ依存部だけの修正で済まそうな気がしまたので、μT-Kernel(AT91版)にCortex-M版の修正を行いタスク制御くらいまで(rslp_tskも含めて)は思いどうりに動作していると思っています。
目的はディスパッチャとSysTick割り込みだけなので、その他の修正は動作するだけのいい加減な修正(大部分はチェックの削除)で済ませています。(私の目標はT-Kerenlではありません。T-Kerenlにはsample1を移植して確認)

 チップ依存部以外の修正を行うとなると検証作業が心配です。TOPPERSの検証ツールはどんなものがあり、又、小生でも入手は可能なのでしょうか。
 当初予想したより大きな修正になりそうなので、一人で取り組むには相応の覚悟が必要であることを理解しました。 私には、コンフィギュア周りは明らかに重荷です。
 さて如何しよう、が今の心境です。 同じようなことを考えている人はいませんでしょうか。

以上

10/11/01 Meika Sugimoto <asuka.choronos @ gmail.com>:
> こいさんさま
>
> 杉本です.
>
> まずカーネルの修正に関する話題については
> ここで議論することは全く問題ないと思います.
>
>
> 本題の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の実装では、割り込み回りは重すぎると思っています。
>>
>>  こんな話を、ここでしても良いのでしょうか?
>>  どなたか別途、ご相談できればと思っています。
>>
>> 以上
>
>
>