(toppers-users 3787) SSPのスタックサイズの求め方

高橋和浩@nifty takahashi_kazuhiro @ nifty.com
2012年 1月 19日 (木) 16:48:21 JST


斎藤様
回答ありがとうございます。

了解しました。

忘備録として サブジェクトを変えておきます。


On Thu, 19 Jan 2012 15:15:43 +0900
Naoki Saito <nsaito.nmiri @ gmail.com> wrote:

> 高橋さま
> 
> 斉藤です.
> 
> > 利用する場合になにか公式があったらいいように思います。
> 
> 式として表現されたものはありませんが,
> 考え方としては(泥臭いですが)あります.
> 
> 分かりにくいかもしれませんが一言で表現しますと,
> あるタスクとそれに対してプリエンプト可能なタスクの組合せを
> 調べて全体を繋ぎ合わせますと,全体が木のような構造で
> 表現できますので,その根から葉に至る全てのパスの中でもっとも
> スタック使用量が多くなる組合せを選択する.
> という具合になります.
> 
> 例えば,次の例では
> CRE_TSK(TASK1, { TA_NULL, 0, task1, 2, 10, NULL });
> CRE_TSK(TASK2, { TA_NULL, 0, task2, 6, 30, NULL });
> CRE_TSK(TASK3, { TA_NULL, 0, task3, 4, 50, NULL });
> CRE_TSK(TASK4, { TA_ACT,  0, task4, 8, 100, NULL });
> DEF_EPRI(TASK4, { 4 } );
> 
> ・例えば TASK2 に着目するとこれをプリエンプト可能なタスクは
> TASK1とTASK3です.
> ・例えばTASK4に着目するとこれをプリエンプト可能なタスクは
> TASK1 だけです.(実行中は優先度4になりますので)
> 
> 結果として
> (1) TASK1
> (2) TASK2→TASK3→TASK1
> (3) TASK2→TASK1
> (4) TASK3→TASK1
> (5) TASK4→TASK1
> の組合せが得られます.
> このなかで最大は(5) 100+10=110 となります.
> 
> 以上です.
> 
> 2012年1月18日14:40 高橋和浩@nifty <takahashi_kazuhiro @ nifty.com>:
> > 具体的な回答ありがとうございます。 アライブビジョンソフトウエアの高橋です。
> >
> > 挙動についてよくわかりました。 それから、高田先生の回答で、ようやくわかったのですが
> > 実行時優先度と起動時優先度の組み合わせで、使用するスタックサイズが決まるので
> > 利用する場合になにか公式があったらいいように思います。
> >
> >
> > On Wed, 18 Jan 2012 10:50:28 +0900
> > Naoki Saito <nsaito.nmiri @ gmail.com> wrote:
> >
> >> 斉藤です.
> >> 説明を補足いたします.
> >> (先の例では define 文は必要なかったですね...)
> >>
> >> 例の場合,実行開始するまでは優先度 INI_PRI(= 5) で,
> >> 一旦実行開始すると,終了するまで EXE_PRI(=3)で動きます.
> >> (プリエンプトされても3のまま)
> >>
> >> 実行開始する前までは優先度5なので,
> >> 実行開始前で,他に優先度4をもった実行可能状態のタスク TASK2 が存在する場合,
> >> スケジューラは 優先度4 のタスクを先に実行開始します.
> >>
> >> 以上です.
> >>
> >> 2012年1月18日10:42 Naoki Saito <nsaito.nmiri @ gmail.com>:
> >> > 高橋さま,皆様
> >> >
> >> > お世話になっております.
> >> > 斉藤です.
> >> >
> >> > 厳密には少し異なりますが挙動をコードで説明しますと,
> >> >
> >> > #define INI_PRI 5
> >> > #define EXE_PRI 3
> >> > CRE_TSK(TASK1 , { TA_ACT , 0 , task , INI_PRI , STACK_SIZE , NULL });
> >> > DEF_EPRI(TASK1 , { EXE_PRI });
> >> >
> >> > という初期設定だったとします.
> >> >
> >> > void task(intptr_t exinf) {
> >> >   // タスク処理...
> >> > }
> >> >
> >> > と書いたものは
> >> >
> >> > void task(intptr_t exinf) {
> >> >    chg_pri(TASK1, EXE_PRI);   // 厳密にはタスク実行前に優先度が上げられる
> >> >
> >> >   // タスク処理...
> >> > }
> >> >
> >> > のように実行される,ということです.
> >> > 厳密にはタスク実行前に既に優先度が引き上げられていますが.
> >> >
> >> > イメージつかめましたでしょうか.
> >> > 文書が不足しており申し訳ありません.
> >> >
> >> > 以上,よろしくお願いします.
> >> >
> >> > 2012年1月18日10:19 高橋和浩@nifty <takahashi_kazuhiro @ nifty.com>:
> >> >> 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/
---
アライブビジョンソフトウエア株式会社
高橋和浩
673-0005兵庫県明石市小久保2-2-7幹線ビル4F
Email:takahashi_kazuhiro @ nifty.com
http://homepage3.nifty.com/ALVS/