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

Hiroaki TAKADA hiro @ ertl.jp
2012年 1月 19日 (木) 14:47:51 JST


こいさん

実行時優先度は、起動時優先度よりも高い(値が小さい)か同じでなければ
なりません。(そうでないと、E_PARエラーになるはず)

>  現行のSSPのCFGで以下の設定をすると、優先度反転が発生します。これは良い
> のでしょうか。
>  TASK3が動作中にTASK4はTASK3より優先度が高いのに起動できません。

これはこういう意図です。実行時優先度を設定したということは、それ以下の
起動時優先度のタスクは動いてくれるなという意味です。これによって、スタ
ック領域が少なくてすむわけです。

優先度を2つ持っているように見えるというのは、ご指摘通りかもしれません。

高田広章
名古屋大学

(12/01/19 10:59), koizumi yoshiyuki wrote:
>  高田先生
>  こいさんです。表現は色々有ると思いますが、私にはSSPは優先度を2つ持って 
> いるように見えています。
>  2つの優先度は _PRIORITY >_EXEPRIORITY 設定されてる必要が有るでしょ 
> う。これは解りにくいケースもあると思います。
>  同じようなケースが(私にはある意味、同じように見えています)Cortex-M3 
> の割り込み優先度に見られます。ここでは優先度を上位/下位の2つに分け、上位 
> 側で横取り割り込み優先度とし、下位側は等優先度内(制約タスク相当)の優先 
> 度としています。外からは優先度は一つしかないので優先度設定の混乱を避ける 
> ことができていると思います。
>  尚、
>  現行のSSPのCFGで以下の設定をすると、優先度反転が発生します。これは良い 
> のでしょうか。
>  TASK3が動作中にTASK4はTASK3より優先度が高いのに起動できません。
>  テストタスクを3つから4つに増やし優先度を以下のように設定する
>  sample1.h
> #define INIT_PRIORITY (1)
> #define MAIN_PRIORITY (2)
> #define TASK1_PRIORITY (3)
> #define TASK2_PRIORITY (4)
> #define TASK3_PRIORITY (5)
> #define TASK4_PRIORITY (6)
> #define TASK3_EXEPRIORITY (4)
> #define TASK4_EXEPRIORITY (3)
>  sample1.cfgを以下のように記述
> CRE_TSK(INIT_TASK , { TA_ACT , 0 , init_task , INIT_PRIORITY , 
> STACK_SIZE , NULL });
> CRE_TSK(MAIN_TASK , { TA_NULL , 0 , main_task , MAIN_PRIORITY , 
> STACK_SIZE , NULL });
> CRE_TSK(TASK1 , { TA_NULL , 1 , task , TASK1_PRIORITY , STACK_SIZE , 
> NULL });
> CRE_TSK(TASK2 , { TA_NULL , 2 , task , TASK2_PRIORITY , STACK_SIZE , 
> NULL });
> CRE_TSK(TASK3 , { TA_NULL , 3 , task , TASK3_PRIORITY , STACK_SIZE , 
> NULL });
> CRE_TSK(TASK4 , { TA_NULL , 4 , task , TASK4_PRIORITY , STACK_SIZE , 
> NULL });
> DEF_EPRI(TASK3 , { TASK3_EXEPRIORITY });
> DEF_EPRI(TASK4 , { TASK4_EXEPRIORITY });
>  CFGで生成されたkernel_cfg.cは以下のようになり、TASK3とTASK4の優先度の 
> 反転が発生しています。
> const uint_t _kernel_tinib_epriority[TNUM_TSKID] = 
> {INT_PRIORITY(1),INT_PRIORITY(2),INT_PRIORITY(3),INT_PRIORITY(4),INT_PRIORITY(4),INT_PRIORITY(3)};
>  以上
> 2012年1月18日10:30 Hiroaki TAKADA <hiro @ ertl.jp <mailto:hiro @ ertl.jp>>:
> 
>     高橋様、皆様
> 
>     この件に関して、TOPPERS新世代カーネル仕様書に追加予定の文をお送りし
>     ます。
> 
>     -----
>     SSPカーネルにおける追加機能として,タスクに対して,実行時優先度の情報を
>     持つ.タスクの実行時優先度は,起動時優先度が異なるタスク間でスタック領
>     域を共有するために,起動時優先度とは異なる優先度でタスクを実行するため
>     の機能である.タスクが起動された後,最初に実行状態になる時に,タスクの
>     ベース優先度が,タスクの実行時優先度に設定される.
>     -----
> 
>     仕様書の文ですので、これだけでは導入意図がわかりにくいと思います。
> 
>     読みにくい文ですので、お勧めはしませんが、以下に説明があります。
> 
>     http://www.j-tokkyo.com/2000/G06F/JP2000-132409.shtml
> 
>     OSEK OSをご存じのであれば、OSEK OSの内部リソースに相当する機能と言った
>     方がわかりやすいかもしれません。
> 
>     高田広章
>     名古屋大学
> 
>     (12/01/18 10:19), 高橋和浩@nifty wrote:
>      > MLを拝見させていただいています。
>      > アライブビジョンソフトウエアの高橋と申します。
>      >
>      > SSPについて話が進んでいるようなのですが、少しついていけません。
>      > 「実行時優先度」とは何なのか、ちょっとわかりません。
>      > ドキュメントに何か書かれたものがございますでしょうか?
>      >
>      > ssp_spec.txtの
>      >
>     ----------------------------------------------------------------------
>      > ○前提となる文書
>      > [1] トロン協会: μITRON4.0仕様, Ver.4.02.00, 2004年.
>      > [2] TOPPERSプロジェクト: TOPPERS新世代カーネル仕様書 Release 1.2.0
>      > [3] TOPPERSプロジェクト: TOPPERS標準割込み処理モデル, 最終更新:
>     2008年
>      > 4月11日.
>      > ---------------------------------------------------------------------
>      > の[1][2]を見ても「実行時優先度」は見当たりませんでした。
>      > #SSPのR8Cのパッケージのデータも確認しましたが見当たりません。
>      >
>      > [1]で記載がある用語では
>      > 起動時優先度
>      > ベース優先度
>      > 現在優先度
>      >
>      > かと思いますが、さらに実行時優先度はまた違うものなのでしょうか?
>      >
>      > よろしくお願いします。
>      >
>      > すいません
>      > (toppers-users 3751) に書かれていることもよくわかりません。
>      >
>      >> DEF_EPRIを使うと異なるタスク優先度を持つタスクに対して実行時に
>      >> 同一のタスク優先度を設定できます。
>      > 単純に静的API(DEF_EPRI)で、CRE_TSKの起動時優先度の代わりに、実行
>     時優先度と呼ばれるものが
>      > が使われるだけのように思うのですが、たぶんここに誤解があると思っ
>     ています。
>      >
>      >
>      >
>      > On Wed, 18 Jan 2012 00:08:49 +0900
>      > 杉本明加<asuka.choronos @ gmail.com
>     <mailto:asuka.choronos @ gmail.com>> wrote:
>      >
>      >> こいさんさん
>      >>
>      >> 杉本です。
>      >>
>      >> DEF_EPRIはSSPで導入した実行時優先度を定義するための静的APIです。
>      >>
>      >> タスクに対してDEF_EPRIで実行時優先度を指定しておくと、タスクが
>      >> 最初に実行状態になった時にCRE_TSKで指定したタスク優先度では
>      >> なくDEF_EPRIで指定した値がタスク優先度に設定されます。
>      >>
>      >> DEF_EPRIを使うと異なるタスク優先度を持つタスクに対して実行時に
>      >> 同一のタスク優先度を設定できます。
>      >>
>      >> これはタスク間の排他に用いたり(SEK/VDXやAUTOSAR OSでいう内部リ
>     ソースと
>      >> 同様の振る舞いと)、異なるタスク優先度を設定した(むしろSSPでは
>     そのように
>      >> しか指定できませんが)タスク間でスタック領域を共有することができ
>     ます。
>      >>
>      >>
>      >> 実行時優先度の指定をどのように行うかはCRE_TSKを拡張する
>      >> 方法などいくつか検討しましたが、他のカーネルとの互換性を考慮し
>      >> 新たに静的APIを追加することとしました。
>      >>
>      >> 以上、よろしくお願いします。
>      >>
>      >>
>      >> 2012年1月17日17:54 koizumi yoshiyuki<koizumiyoshiyuki @ gmail.com
>     <mailto:koizumiyoshiyuki @ gmail.com>>:
>      >>>  こいさんです
>      >>>
>      >>>  SSPの DEF_EPRI とは何でしょうか。CPU例外が発生したときの優
>     先度のように見えるのですがよくわかりません。doc/*.txtにも特に記述が
>     ありません。
>      >>>
>      >>>  sample1.cfgには以下のような記述があります。
>      >>> CRE_TSK(TASK3 , { TA_NULL , 3 , task , TASK3_PRIORITY ,
>     STACK_SIZE , NULL
>      >>> });
>      >>> DEF_EPRI(TASK3 , { TASK3_EXEPRIORITY });
>      >>>  sample1.hで優先度の定義は
>      >>> #define INIT_PRIORITY (1)
>      >>> #define MAIN_PRIORITY (2)
>      >>> #define TASK1_PRIORITY (3)
>      >>> #define TASK2_PRIORITY (4)
>      >>> #define TASK3_PRIORITY (5)
>      >>> #define TASK3_EXEPRIORITY (4)
>      >>>  です。
>      >>>
>      >>>  cfgで作成された、kernel_cfg.cは以下のようになっています。
>      >>>
>      >>> const uint_t _kernel_tinib_epriority[TNUM_TSKID] = {
>      >>>
>     INT_PRIORITY(1),INT_PRIORITY(2),INT_PRIORITY(3),INT_PRIORITY(4),INT_PRIORITY(4)
>      >>> };
>      >>>
>      >>>
>      >>>  TASK3の優先度は5になって欲しい気がしています。
>      >>>  DEF_EPRI(TASK3 , { TASK3_EXEPRIORITY });が関連しているので
>     しょうか。
>      >>>  以上
>      >>>
>      > ---
>      > アライブビジョンソフトウエア株式会社
>      > 高橋和浩
>      > 673-0005兵庫県明石市小久保2-2-7幹線ビル4F
>      > Email:takahashi_kazuhiro @ nifty.com
>     <mailto:Email%3Atakahashi_kazuhiro @ nifty.com>
>      > http://homepage3.nifty.com/ALVS/
> 
>