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

koizumi yoshiyuki koizumiyoshiyuki @ gmail.com
2012年 1月 19日 (木) 10:59:47 JST


  高田先生

こいさんです。表現は色々有ると思いますが、私には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>:

> 高橋様、皆様
>
> この件に関して、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>  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>:
> >>>  こいさんです
> >>>
> >>>  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
> > http://homepage3.nifty.com/ALVS/
>
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://www.toppers.jp/pipermail/users/attachments/20120119/959b61be/attachment.html>