(toppers-users 3844) Re: SSPの DEF_EPRI とは何でしょうか。

koizumi yoshiyuki koizumiyoshiyuki @ gmail.com
2012年 1月 30日 (月) 11:41:19 JST


 こいさんです。

自己レスです。

タスクのクリアを前にすると、起動優先度が低くて実行優先度の高いタスクの起動要求でプリエンプトされるケースが出てしまいます。
現状ではこのケースはクリアしないのでカーバされている。起動優先度を保存し、この様な事象を回避する処理が必要になります。
大きなオーバヘッドでは無いと思っています。

以上

2012年1月22日11:23 koizumi yoshiyuki <koizumiyoshiyuki @ gmail.com>:

>  斉藤さん
>
> こいさんです。
>
> そうですね。訂正されたケースなら、sample1で確認できるケースです。sample1で動作させている範囲ならクリアの位置変更で動作できると思います。
>
>
> クリアの位置を変えてもrun_taskの論理は変わらないと思います。クリティカルセクション関連で、run_taskが使用しているローカル変数以外の変数(ready_primapだけだと思う)がrun_taskの論理を超えた動きがなければよいと思っています。全体を把握しているわけではないのですが、そんなケースはなさそうな気がしています。少々曖昧ですみません。
>  以上
> 2012年1月22日0:19 Naoki Saito <nsaito.nmiri @ gmail.com>:
>
>> こいさんさん
>>
>> 斉藤です.
>>
>> すいません.勘違いしていました.
>> 私の挙げました事項は問題ないようです.
>>
>> >> ここまでは良いのですが,run_task の while 判定
>> >>  /* 戻り先タスクの実行時優先度より高い起動時優先度をもつタスクが起動されたか */
>> >> } while((!primap_empty()) && (saved_pri > (next_pri =
>> search_schedtsk())));
>> >>
>> >> の primap_empty() が true となり,終了しませんか?
>>
>> この点については,
>> > (0) カーネルスタート(primap = 2)
>> > (1) TASK2 実行開始 (run_task でクリアされて primap = 0)
>> > (2) TASK2 の中から TASK1 起動 (primap = 1)
>> > (3) TASK1 実行開始 (primap = 0)
>> > (4) TASK1 終了 (primap = 0)
>>
>> の後,
>> (5) run_task 終了 → TASK2 の act_tsk に戻る (primap = 0)
>> (6) TASK2 終了 (primap = 0)
>> (7) run_task 終了 (primap = 0)
>>
>> で,問題なく終了するようです.
>> と,これだけでは何ですので,自タスクを起動する場合
>> についても同様に検討しました.が,問題ないようです.
>>
>> 概ね良さそうに見えますね.
>> さらに見落としがないか,調べてみます.
>>
>> 以上,よろしくお願いします.
>>
>> 2012年1月21日23:48 Naoki Saito <nsaito.nmiri @ gmail.com>:
>> > 斉藤です.
>> >
>> > 間違えました.
>> >
>> >> (0) カーネルスタート(primap = 1)
>> >> (1) TASK1 実行開始 (run_task でクリアされて primap = 0)
>> >> (2) TASK1 の中から TASK2 起動 (primap = 2)
>> >> (3) TASK2 実行開始 (primap = 0)
>> >> (4) TASK2 終了
>> >
>> > 正しくは,こうです.
>> >
>> > (0) カーネルスタート(primap = 2)
>> > (1) TASK2 実行開始 (run_task でクリアされて primap = 0)
>> > (2) TASK2 の中から TASK1 起動 (primap = 1)
>> > (3) TASK1 実行開始 (primap = 0)
>> > (4) TASK1 終了
>> >
>> > 申し訳ありませんでした.
>> > 以上,よろしくお願い致します.
>> >
>> > 2012年1月21日23:46 Naoki Saito <nsaito.nmiri @ gmail.com>:
>> >> こいさんさん
>> >>
>> >> 斉藤です.
>> >>
>> >> キューイングの件,ご提案ありがとうございます.
>> >>
>> >>>  タスクの軌道前にprimap_clearをすると、sanple1ではASPと同様にキューイングが実現できているように動作します。
>> >>
>> >> 一見すると良いアイディアのように思えるのですが,
>> >> 例えば 2つのタスクTASK1(ID=1), TASK2(ID=2)があり,
>> >> TASK1 の方が高優先度とします.
>> >> そしてシステム起動時には TASK1 が休止状態,
>> >> TASK2が実行可能状態とします.
>> >>
>> >> (0) カーネルスタート(primap = 1)
>> >> (1) TASK1 実行開始 (run_task でクリアされて primap = 0)
>> >> (2) TASK1 の中から TASK2 起動 (primap = 2)
>> >> (3) TASK2 実行開始 (primap = 0)
>> >> (4) TASK2 終了
>> >>
>> >> ここまでは良いのですが,run_task の while 判定
>> >>  /* 戻り先タスクの実行時優先度より高い起動時優先度をもつタスクが起動されたか */
>> >> } while((!primap_empty()) && (saved_pri > (next_pri =
>> search_schedtsk())));
>> >>
>> >> の primap_empty() が true となり,終了しませんか?
>> >>
>> >> 以上,よろしくお願い致します.
>>
>
>
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://www.toppers.jp/pipermail/users/attachments/20120130/0a88b7a5/attachment.html>