(toppers-users 3865) Re: SSPのスタックの記述

Naoki Saito nsaito.nmiri @ gmail.com
2012年 2月 1日 (水) 11:09:50 JST


高橋様,みなさま

おはようございます.
斉藤です.

> すいません、これって独自言語ですよね。その独自言語の文法等
> 読めるようにじっくり勉強したいと思いますが
>
> どの変数が何に出力されるのか結論をざっくり教えていただけませんか?
> たぶんどこかにその計算値が出力されるのだろうと推測しますが

記述言語は,以下の「マクロプロセッサ仕様書」に従って記述しています.
http://www.toppers.jp/documents.html#new-cfg
バージョンはお使いのコンフィギュレータのバージョンによりますが,
R8C向け簡易パッケージに含まれるものはバージョン1.5.0 で作業しましたので
macproc-spec-20090126.pdf  辺りを参照していただければよいと思います.

計算結果(タスクのスタック使用量の見積値)が格納される変数は max_tsk_stksz です.
この変数には stksz_estimated という順序付きリスト変数の中から最大値が格納されます.
327行目から331行目の部分です.

stksz_estimated には,各パス毎のスタック使用量の計算結果が並べられます.
スタック使用量のリストを求める関数が calc_stksz で,
パラメータとして起動時優先度を与えると,
そのタスクから実行がはじまった場合に最悪どれだけのスタック使用量に
なるか,というリストを作ります.

例えば,次の例では
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 });

ここで TASK2 の起動時優先度(内部表現では2になります)に着目すると
これをプリエンプト可能なタスクはTASK1とTASK3ですので,
"A→B" を「AがBにプリエンプトされる」関係を示すものとして
・TASK2→TASK3→TASK1
・TASK2→TASK1
の場合のスタック使用量を並べたリスト "90 40" (順番逆かもしれないですけど)が
関数の結果です.

これをすべての起動時優先度にするのは計算の無駄ですので
(なぜなら起動時優先度が高いものは,他の場合に含まれる可能性が高いから)
実際に計算する起動時優先度だけを root_apri というリストに入れて,
その場合だけ計算するようにしています.


> 1.DEF_ICSが宣言されている場合 --> DEF_ICSの値が使われる。 DEFAULT_ISTKSZが宣言されてもそれは破棄される。

はい.仰るとおりです.

> 2.DEF_ICSが宣言されていない場合 --> DEFAULT_ISTKSZが共有スタックサイズに使われる。DEFAULT_ISTKSZが未宣言の場合はどこかでエラーになる。

これも仰るとおりです.DEFAULT_ISTKSZ  はターゲット依存部を用意される方には
定義していただくようにお願いするものですが,定義していない場合はエラーとなります.
982行目で値を参照していますので,
おそらくコンフィギュレーション時にエラーになるんじゃなかったかと.

> さらに上記の計算値と比較して小さいとどこかでエラーになる。
> ということでしょうか?

エラーというよりは警告扱いになります.
kernel.tf の 983,999行目が該当行です.

> ということはCRE_TSKで指定したスタックサイズをタスクスタックサイズとしている
> わけで安全係数は持っていないということですね。

はい.持っておりません.

> 通常 高優先度のタスクをact_tskした場合に、act_tsk呼ばれてから上位のタスクにプリエンプトした場合に
> カーネルがスタックを大きくは無いですが消費します。これは見込まれていないということですね。

仰るとおりです.

以上ですが,わかりにくい箇所があればご指摘ください.
よろしくお願いいたします.

2012年1月31日10:53 高橋和浩@nifty <takahashi_kazuhiro @ nifty.com>:
> 斎藤様 MLの皆様
> おはようございます。 (前回様が余分にあり失礼しました)
> アライブビジョンソフトウエアの高橋です。
>
> Q1.kernel.tfの確認
>> > SSPでは、手計算せずに自動的に計算される仕組みがあるように受け取れます。
>> > どのように自動化されるのでしょうか?
>>
>> kernel.tf の中で タスクの最大スタック使用量を格納する変数として
>> max_tsk_stksz がありますので,詳しくはこの変数の値を求める処理を
>> ご覧いただくのが早いと思います.
>> 具体的には,246行目から331行目までの部分です.
>> kernel_cfg.c には処理過程を確認するためのコメントを
>> 出力するようにしています.
>
> すいません、これって独自言語ですよね。その独自言語の文法等
> 読めるようにじっくり勉強したいと思いますが
>
> どの変数が何に出力されるのか結論をざっくり教えていただけませんか?
> たぶんどこかにその計算値が出力されるのだろうと推測しますが
>
> TOPPERSの成果物を使うにしても、そういう独自言語も読まないと取り付く島も無い
> というわけではないというわけでもないと思いますので。
>
> Q2.実際の指定方法
>> > こいさんさんの話によるとどこかにdefineしているのみで、DEF_ICSの静的APIの宣言も
>> > されていないようなことが書かれていましたが、これは事実と違うのでしょうか?
>>
>> もとのお話は (toppers-users 3840) ですね.
>> その中の「DEF_ICS の静的APIの宣言がされていない」というのは
>> sample1.cfg に DEF_ICS の記述が存在しないということと思いますので,
>> そのご指摘については事実と思います.
>>
>> DEF_ICS がコンフィギュレーションファイルに存在しない場合は,
>> ターゲット依存部で定義されている DEFAULT_ISTKSZ マクロの
>> 値が指定されたものとして処理します.
>> kernel.tf の972行目から984行目までが DEF_ICS が存在しない場合の
>> 処理となっています.
>
> 上記Q1とも同じことを違う聞き方をしているのですが、仕組みが分からないのでどう記述して
> いいかわからないので、一見矛盾しているので、事実じゃないのかと質問しました。
> 上記は、自動的に計算される。一方、固定のdefineの値が使われるというのは矛盾しているように
> 思うからです。ですが上記回答から、推測するに(また推測しないと理解できない回答だったようです。
> 理解が悪くてすいません)
> 1.DEF_ICSが宣言されている場合 --> DEF_ICSの値が使われる。 DEFAULT_ISTKSZが宣言されてもそれは破棄される。
> 2.DEF_ICSが宣言されていない場合 --> DEFAULT_ISTKSZが共有スタックサイズに使われる。DEFAULT_ISTKSZが未宣言の場合はどこかでエラーになる。
> さらに上記の計算値と比較して小さいとどこかでエラーになる。
> ということでしょうか?
>
> Q3.設計思想の件その1
>> > Q2.設計思想の件その1
>> >>> 2.TOPPERSの会員内のレビューで議題にあがっいなかったのでしょうか?
>> > は、回答が難しいのでしょうか?
>>
>> いえいえ,難しくはありません.
>> ご質問にお答え出来ておらずすいませんでした.
>> SSP仕様レビューという議題の中で DEF_ICS のレビューの際に
>> ついでに議論されました程度で,最初から議題に挙がっていたわけでは
>> ありませんでした.
>
> DEF_ICSのレビューのことですよ。
> レビューといっても仕様のレビューではなく、実装のコードレビューかなにかですか?
> 結果的にはレビューしているけど抜けたという感じですか? 最初から用語の間違いでICSの用語の誤用であり、レビューで指摘しやすいような
> 内容かと思いますレビューのチェックシートを作って互換性という項目や機能の用語に誤用がないかを入れれば間違いは無かったように
> 思いますが、後の祭りですかね。
> レビューは実際にはコード/仕様いずれかですか? レビューの際のチェックシートなどは利用していませんか?
>
> Q4.スタックのエラーチェック
>> 「多重割り込みやカーネル処理でのスタックサイズ」までは
>> 見ておりません.単純に
>> (DEF_ICSで指定した値) > (CRE_TSKを元にしたタスクスタック使用量の計算値)
>> をチェックしているだけです.
>> kernel/kernel.tf ですと,982行目から984行目および
>> 998行目から1000行目の部分です.
> 回答ありがとうございます。
> わかりました。
> こういう回答はいいですね。ちゃんと結論を書いていただいてます。さらに詳しくはここを見てくださいとなっています。
> 質問したのは 「少なくとも大」 と 「それを超える」は違うことです。なので質問させていただきました。
>
> ということはCRE_TSKで指定したスタックサイズをタスクスタックサイズとしている
> わけで安全係数は持っていないということですね。
> 通常 高優先度のタスクをact_tskした場合に、act_tsk呼ばれてから上位のタスクにプリエンプトした場合に
> カーネルがスタックを大きくは無いですが消費します。これは見込まれていないということですね。
>
>
> A1.下記の回答
>> > あまり大きすぎると小さく設定したいのにエラーになってできなくなることと
>> かありませんか?
>> ご質問を確認させていただきたいのですが,
>> ・「あまり大きすぎると」というのは「多重割り込みやカーネル処理での
>> スタックサイズ」が,
>> ・「小さく設定したい」というのは 「DEF_ICS の設定値」が,
>> という理解でよろしいでしょうか?
>
> 再度そのまま引用します。
>>Q3.スタックサイズの安全係数
>>> ・サイズチェックは必要と思われるため,CRE_TSK の指定値から
>>>  全タスクのスタックサイズを算出し,すくなくともそれより
>>>  大であることはチェックする.
>>
>>たぶん、多重割り込みやカーネル処理でのスタックサイズつまり本来のICSのサイズを見てチェックされる
>>と思うのですが、イコールでなく、少なくとも大であるというのはどの程度でチェックされていますか?
>>あまり大きすぎると小さく設定したいのにエラーになってできなくなることとかありませんか?
>
> 文脈とまで言いませんが、そこで区切らないでもらえたら理解可能だと思います。
> すでにQ4で回答されていることです。
>
> よろしくお願いします。
>
>
>
>
> On Mon, 30 Jan 2012 21:43:22 +0900
> Naoki Saito <nsaito.nmiri @ gmail.com> wrote:
>
>> 高橋さま
>>
>> 斉藤です.
>>
>> (12/01/30 17:16), 高橋和浩@nifty wrote:
>> > 斎藤様様
>> > 早速の回答ありがとうございます。
>> >
>> >
>> > Q1.自動化のしくみを教えてください。
>> >> そうしますと,その部分の計算を手で行うことが,
>> >> 自動的に計算される場合に比べて手間がかかりメンドウであると
>> >> そういうつもりでの表現でした.
>> > すいません、それがどう面倒かわからないので聞いているのです。
>>
>> ご指摘頂いて,私の単なる感想にすぎないのかなと思い直しました.
>> 申し訳ありませんがこの点につきましては無視して下さい.
>>
>> > SSPでは、手計算せずに自動的に計算される仕組みがあるように受け取れます。
>> > どのように自動化されるのでしょうか?
>>
>> kernel.tf の中で タスクの最大スタック使用量を格納する変数として
>> max_tsk_stksz がありますので,詳しくはこの変数の値を求める処理を
>> ご覧いただくのが早いと思います.
>> 具体的には,246行目から331行目までの部分です.
>> kernel_cfg.c には処理過程を確認するためのコメントを
>> 出力するようにしています.
>>
>> > こいさんさんの話によるとどこかにdefineしているのみで、DEF_ICSの静的APIの宣言も
>> > されていないようなことが書かれていましたが、これは事実と違うのでしょうか?
>>
>> もとのお話は (toppers-users 3840) ですね.
>> その中の「DEF_ICS の静的APIの宣言がされていない」というのは
>> sample1.cfg に DEF_ICS の記述が存在しないということと思いますので,
>> そのご指摘については事実と思います.
>>
>> DEF_ICS がコンフィギュレーションファイルに存在しない場合は,
>> ターゲット依存部で定義されている DEFAULT_ISTKSZ マクロの
>> 値が指定されたものとして処理します.
>> kernel.tf の972行目から984行目までが DEF_ICS が存在しない場合の
>> 処理となっています.
>>
>> > Q2.設計思想の件その1
>> >>> 2.TOPPERSの会員内のレビューで議題にあがっいなかったのでしょうか?
>> > は、回答が難しいのでしょうか?
>>
>> いえいえ,難しくはありません.
>> ご質問にお答え出来ておらずすいませんでした.
>> SSP仕様レビューという議題の中で DEF_ICS のレビューの際に
>> ついでに議論されました程度で,最初から議題に挙がっていたわけでは
>> ありませんでした.
>>
>> > Q3.スタックサイズの安全係数
>> >> ・サイズチェックは必要と思われるため,CRE_TSK の指定値から
>> >>  全タスクのスタックサイズを算出し,すくなくともそれより
>> >>  大であることはチェックする.
>> >
>> > たぶん、多重割り込みやカーネル処理でのスタックサイズつまり本来のICSのサイズを見てチェックされる
>> > と思うのですが、イコールでなく、少なくとも大であるというのはどの程度でチェックされていますか?
>>
>> 「多重割り込みやカーネル処理でのスタックサイズ」までは
>> 見ておりません.単純に
>> (DEF_ICSで指定した値) > (CRE_TSKを元にしたタスクスタック使用量の計算値)
>> をチェックしているだけです.
>> kernel/kernel.tf ですと,982行目から984行目および
>> 998行目から1000行目の部分です.
>>
>> > あまり大きすぎると小さく設定したいのにエラーになってできなくなることと
>> かありませんか?
>>
>> ご質問を確認させていただきたいのですが,
>> ・「あまり大きすぎると」というのは「多重割り込みやカーネル処理での
>> スタックサイズ」が,
>> ・「小さく設定したい」というのは 「DEF_ICS の設定値」が,
>> という理解でよろしいでしょうか?
>>
>> 以上,よろしくお願いします.
>>
> ---
> アライブビジョンソフトウエア株式会社
> 高橋和浩
> 673-0005兵庫県明石市小久保2-2-7幹線ビル4F
> Email:takahashi_kazuhiro @ nifty.com
> http://homepage3.nifty.com/ALVS/