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

Naoki Saito nsaito.nmiri @ gmail.com
2012年 2月 1日 (水) 12:10:25 JST


高橋様,みなさま

斉藤です.

> わかりにくいというより、回答がありません。また推測が必要なようです。
> メールでのコミュニケーションは難しいですね。

ご指摘ありがとうございます.

>> > どの変数が何に出力されるのか結論をざっくり教えていただけませんか?
>> > たぶんどこかにその計算値が出力されるのだろうと推測しますが
> ちゃんと質問しているつもりなのですが、なぜ回答が無いのか不思議です。

「変数に出力される」というつもりだったのですが,
さらに後のことを要求されていたのですね...

ご推測通り(さすがですね)kernel_cfg.c へコメントの形で出力されます.
334行目から336行目のところが該当行です.

$SPC$* Estimated Task Stack Size List = $stksz_estimated$$NL$
$SPC$* Maximum Task Stack Size = $max_tsk_stksz$$NL$
$SPC$*/ $NL$$NL$

これで,いかがでしょう(だめかな)?
以上,よろしくお願いします.


2012年2月1日11:28 高橋和浩@nifty <takahashi_kazuhiro @ nifty.com>:
> 斎藤様 MLの皆様
> こんにちは アライブビジョンソフトウエアの高橋です。
>
> 回答ありがとうございます。
> ですが、なぜか回答いただいていません。
>> 以上ですが,わかりにくい箇所があればご指摘ください.
> わかりにくいというより、回答がありません。また推測が必要なようです。
> メールでのコミュニケーションは難しいですね。
>
> Q1.何に出力されますか?
>
>> > どの変数が何に出力されるのか結論をざっくり教えていただけませんか?
>> > たぶんどこかにその計算値が出力されるのだろうと推測しますが
> ちゃんと質問しているつもりなのですが、なぜ回答が無いのか不思議です。
>
>
>> 計算結果(タスクのスタック使用量の見積値)が格納される変数は max_tsk_stksz です.
> と書いていますが、
> これは例えば、
>
> kernel_cfg.c に
> #define max_tsk_stsz 計算結果
> と出力される。
> という形で値がでるので、この値を見て
> DEFAULT_ISTKSZや DEF_ICSを定義すれば、手計算が不要になって便利だ。
> ということなのですか?
>
> すいませんが、よろしくお願いします。
>
>
> On Wed, 1 Feb 2012 11:09:50 +0900
> Naoki Saito <nsaito.nmiri @ gmail.com> wrote:
>
>> 高橋様,みなさま
>>
>> おはようございます.
>> 斉藤です.
>>
>> > すいません、これって独自言語ですよね。その独自言語の文法等
>> > 読めるようにじっくり勉強したいと思いますが
>> >
>> > どの変数が何に出力されるのか結論をざっくり教えていただけませんか?
>> > たぶんどこかにその計算値が出力されるのだろうと推測しますが
>>
>> 記述言語は,以下の「マクロプロセッサ仕様書」に従って記述しています.
>> 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呼ばれてから上位のタスクにプリエンプトした場合に
>> > カーネルがスタックを大きくは無いですが消費します。これは見込まれていないということですね。
>>
>> 仰るとおりです.
>>
>> 以上ですが,わかりにくい箇所があればご指摘ください.
>> よろしくお願いいたします.
>>
> ---
> アライブビジョンソフトウエア株式会社
> 高橋和浩
> 673-0005兵庫県明石市小久保2-2-7幹線ビル4F
> Email:takahashi_kazuhiro @ nifty.com
> http://homepage3.nifty.com/ALVS/