(toppers-users 3789) Re: SSPにタスク起動キューイング

高橋和浩@nifty takahashi_kazuhiro @ nifty.com
2012年 1月 19日 (木) 18:06:52 JST


実装をもう少し見てみました。
スケジューラはこんな感じですね。
-----------------------------------------------

	do {
		runtsk_ipri = tinib_epriority[next_pri];
		
		/* CPUロック解除 */
		t_unlock_cpu();
		
		/* タスク実行開始 */
		(*((TASK)(tinib_task[next_pri])))(tinib_exinf[next_pri]);
		
		if (t_sense_lock()) {
			/*
			 *  CPUロック状態でext_tskが呼ばれた場合は,CPUロックを解除し
			 *  てからタスクを終了する.実装上は,サービスコール内でのCPU
			 *  ロックを省略すればよいだけ.
			 */
		}
		else {
			/*
			 *  このt_lock_cpuをこの下のdisdspの設定のようにしないのは,
			 *  CPUロック中に再度t_lock_cpuを呼ばないためである.
			 */
			t_lock_cpu();
		}
		
		/* 割込み優先度マスクは全解除状態のはずなので,何もしない */
		
		/*
		 *  ディスパッチ禁止状態でext_tskが呼ばれた場合は,ディスパッ
		 *  チ許可状態にしてからタスクを終了する.
		 *
		 *	本来は以下のように記述すべきであるが,いずれにせよdisdspを
		 *	falseにすればいいため,単にfalseに設定する.
		 *
		 *		if (disdsp) {
		 *			disdsp = false;
		 *		}
		 */
		disdsp = false;
		
		/* ビットマップクリア. */
		primap_clear(next_pri);
		
	  /* 戻り先タスクの実行時優先度より高い起動時優先度をもつタスクが起動されたか */
	} while((!primap_empty()) && (saved_pri > (next_pri = search_schedtsk())));
-------------------------------
/*タスク実行開始*/でタスクをサブルーチン呼び出しで、終わるとリターンしてきます(ext_tsk相当)。その後は、
CPUロック状態でない場合のみCPUロック状態にして、その後、今までRunだったタスクQue相当のビットマップを
クリアしてますね。
その後、次のタスクQueを検索にいきます。
検索後、Whileで上のほうのステートメント /*CPUロック解除*/でようやく割り込みハンドラが動作します。

なのでタスクの中でリターンする前に、loc_cpuは有効でその間割り込みはそこまで遅延されるはずです。
すでにそのタスクは休止状態のため空振りを防げると思うのですが、いかがですか?


On Thu, 19 Jan 2012 15:54:39 +0900
koizumi yoshiyuki <koizumiyoshiyuki @ gmail.com> wrote:

>  こいさんです
> 
> すみません。安易な返事を出しました。現状の実装ではロックを解除してから、ビットマップをクリアしいるのでロックでタスクを終了しても解決にはならないと思います。
> 
> 以上
> 
> 2012年1月19日14:39 koizumi yoshiyuki <koizumiyoshiyuki @ gmail.com>:
> 
> > こいさんです
> >
> > 有難うございます。その手がありましたね。少々気持ちが悪いのですが、一般的な手法なのですね。
> >
> > 以上
> >
> > 2012年1月19日13:11 高橋和浩@nifty <takahashi_kazuhiro @ nifty.com>:
> >
> >> アライブビジョンソフトウエアの高橋です。
> >>
> >> > loc_cpuのままext_tskが動作すれば(仕様変更等)回避できるように思います。
> >> 実装済みのようですね。
> >> 失礼しました。
> >>
> >>
> >> On Thu, 19 Jan 2012 12:54:48 +0900
> >> 高橋和浩@nifty <takahashi_kazuhiro @ nifty.com> wrote:
> >>
> >> > こんにちは、アライブビジョンソフトウエアの高橋です。
> >> >
> >> > >要求を溜め込む処理と、要求無し判定処理の同期を取ることができないので、タスク起動のキューイングが無いと、
> >> > >要求を積んでもタスクが起動しないケースが発生すると思います。
> >> >
> >> > 確かにそうなると思います。
> >> > 単純にグローバル変数のフラグとFIFOのバッファで制約タスクが割り込みハンドラからキューを
> >> > 受け取る場合に、フラグとキューが無くなったと判断して、ext_tskする場合に判断後とext_tskの間で
> >> > 割り込んだ場合に空振りすると思います。
> >> >
> >> > loc_cpuのままext_tskが動作すれば(仕様変更等)回避できるように思います。
> >> > つまり
> >> > 1.loc_cpu
> >> > 2.フラグチェック
> >> > 3.無ければext_tsk
> >> > なら空振りは防げるように思います。
> >> > act_tskのキューイングよりも、実装が容易じゃないかと思っています。
> >> >
> >> > 基本的には、定期的にタスクが起動するようなプログラミングスタイルが必要なようにも
> >> > 思いますが、比較的普通に使えた方がよいように思います。
> >> >
> >> >
> >> > On Thu, 19 Jan 2012 12:01:34 +0900
> >> > koizumi yoshiyuki <koizumiyoshiyuki @ gmail.com> wrote:
> >> >
> >> > >  こいさんです
> >> > >
> >> > >
> >> TOPPERS/ASP、SSPではタスク起動は一つキューイングされます。SSPにはその機能がありません。SSPではタスク待ちの処理がないので、タスク起動のキューイングは必須機能だと思いますが如何でしょうか。
> >> > >
> >> > >
> >> 自動車プロファイルの制約タスクはどのように使われているの知りませんが、制約タスクの性格(?)上、タスクは一つの機能を実現する場合に使用されていると勝手な想像をしています。
> >> > >
> >> タスクが複数の要求を処理するような場合、要求をキューなどに溜め込み、タスクを起動することになるでしょう。起動したタスクは要求を取り出して要求を処理し、終了時に次の要求の有無を調べ、要求があれば要求取り出しから処理を繰り返し、なければタスクを終了することになるでしょう。この様な作りの場合、要求を溜め込む処理と、要求無し判定処理の同期を取ることができないので、タスク起動のキューイングが無いと、要求を積んでもタスクが起動しないケースが発生すると思います。
> >> > >
> >> > > 以上
> >> > ---
> >> > アライブビジョンソフトウエア株式会社
> >> > 高橋和浩
> >> > 673-0005兵庫県明石市小久保2-2-7幹線ビル4F
> >> > Email:takahashi_kazuhiro @ nifty.com
> >> > http://homepage3.nifty.com/ALVS/
> >>
> >
> >
---
アライブビジョンソフトウエア株式会社
高橋和浩
673-0005兵庫県明石市小久保2-2-7幹線ビル4F
Email:takahashi_kazuhiro @ nifty.com
http://homepage3.nifty.com/ALVS/