スタックサイズとROMサイズの見積もるには?

初めまして
おいわと申します。

基板  :RX64M
OS   :RTOS
開発環境:e2studio v6.2.0
でプログラムを作成しています。

RTOSを使う場合、タスクの生成時にスタックサイズを設定する必要があるのですが
適正なスタックサイズを見積もれるツールはありますでしょうか?
(どれぐらいのスタックサイズを設定すればよいのか分からずに困っています)

また、特定のファイル(.cや.hなど)または関数レベルで使用しているROMのサイズを
確認することはできますでしょうか?

以上、よろしくお願いいたします。

Parents
  • e2studioは初期の頃に試しにインストールして起動してみただけで、いろいろな事情でHEWもCS+もアンインストールしてます。マニュアルもすべてが揃ってはいないです。従って、未確認な曖昧な情報になります。

    e2studioでもCCRXが起動すると思われます。CC-RXコンパイラユーザーズマニュアルを"Call Walker"で検索すると一か所だけですがヒットするのでCall Walkerに必要なデータをリンケージエディタは出力すると予想できます。コンパイラマニュアルだけでは良くわからないので、e2studioなど関連するマニュアルで"Call Walker"を検索してみるのが良いと思います。CallWalkerの使い方はSHコンパイラマニュアルに記述されてます。ちなみにSHコンパイラマニュアルでは"CallWalker"なので、ブランク有り無しの両方で検索する必要があります。

    ROMサイズは個別にダミーのワークスペースでビルドしてマップファイルを見るのが設定も不要で手っ取り早いように思えます。

  • kijioさん

    おいわです。ご回答ありがとうございます。
    e2studio+Call Walkerでマニュアルを調べたことがないので調べてみます。
    ただ、手当たり次第にe2studioをさわった際に、Call Waikerらしきものはなく「スタック解析」といったものがあったのですが、ここで表示されているものが本当に使用しているスタックサイズなのか。。。?と疑問に思っております。(調査不足なのかもしれません)

    ROMサイズは教えていただいた方法で一度やってみようと思います。
  • こんにちは

    Call Walkerについては単独の資料も一応ありますのでご紹介しておきます。

    https://www.renesas.com/ja-jp/search/keyword-search.html#q=Call+Walker&genre=document

    上記の「Oct.01.09 Rev.2.00」でCall Walkerの使い方を説明しています。(他の2つはHEWに登録する方法の説明です。)

    Call Walkerのインストーラは以下からダウンロードできます。

    https://www.renesas.com/ja-jp/search/keyword-search.html#q=Call+Walker&genre=tooldownload

     

    Call Walkerはコンパイラ(リンカ)が生成したスタック情報ファイル(*.sni)を利用するようです。

    e2 studio ユーザーガイドによれば、e2 studioのスタック解析も同じファイルを利用するようですね。

    kijoさんがおっしゃっているようにスタック情報ファイルを出力するリンクオプションはCC-RXにもありそうです。

    Call Walkerは単独でも使用できそうですので、e2 studioのスタック解析結果と比較もできるかもしれませんね。

     

    使ったことが無いので単に紹介するだけになりますが、以下のようなツールもあります。#2016年7月まではメンテされているようです。ご参考まで。

    RI600PX メモリ容量見積もり

    RI600V4 メモリ容量見積もり

Reply Children
  • 高度なツールがありそうなので安心ですね、メモリーとかROM容量とか、CS+RL78では使用ROM容量とか使用RAM容量とかいうのを、コンパイル時に表示させることができるので、いつもそれを見ながら作業していました、「まだ総容量の30%しか使ってないから自由にできそうだ」とか、前にはそういうのが無い場合の方策としてソフトの実行時ハードウェアの情報コマンドを設けておいてスタック最大とか、メモリーリークとか表示させていました、原理は簡単で最初にRAMを0xFFで満たしておいて最終アドレスから0xFFでなくなるまでを空きと計算するというようなやりかたです、簡単な方法でもRAMやROMの実行時に確認はできると思います。RTOSの場合は領域が自由にできないので難しいのでしょうか?

  • じまさん

    おいわです。ご回答ありがとうございます。

    たくさんの貴重な情報を提供いただき、ありがとうございます。

    Call Walkerは単独のアプリでも使えるのですね。

    コンパイラ(リンカ)が生成したスタック情報ファイル(*.sni)を見つけて、読み込み表示することができました。

    ただ、表示されている数字に関して理解できていないところがあるのですが、

    関数名の隣に表示されているものがその関数が使っている最大スタックサイズで正しいでしょうか?

    システムで使っている最大スタック量はここから何かしら計算する必要があるとの情報があったので、

    関数においても何かしら計算する必要があるのではと思いました。

  • こんにちは

    Call Walkerは静的なスタック最大使用量を算出するのみで、多重割り込みなど動的なスタック最大使用量を算出するには手動で計算する必要があります。以下FAQを参考にしてみてください。(見出しはCS+ですが内容はCall Walkerについて書かれています。)

    FAQ 3000259 : CS+でのスタックの使用量の確認方法について (項目5.以降の記述)

    以下FAQもありましたのでご紹介しておきます。

    FAQ 3000280 : スタック見積もりツール Callwalkerに関する質問まとめ

  • >関数名の隣に表示されているものがその関数が使っている最大スタックサイズで正しいでしょうか?
    は右側ウィンドウのStack sizeのことならYesだと思います。

    左側ウィンドウの()の中が計算されたほしい値になるはずです。Task11(?(にじんでいる))はゼロになってますが、mainは592(?(にじんでいる))です。SHのOSEKやμiTronの経験があります。それぞれのタスクのスタックサイズをこの値以上にの設定しておけば良いはずです。割り込みも同様にスタックサイズを設定しておいたような記憶があります。
    システムとはカーネルのことでしょうか?カーネルとそれぞれのタスクが使うのは異なるセクションになると思います。
    コンフィグレータが有ると思うのでそれを使えばあまり考えなくてもOKです。
    ①起動時に全タスクを起動 ②多重割り込みはない ③動的データを使わない なら比較的簡単に全体メモリチェックはできると思います。タスクを作ったり消したりしてRAMを使いまわすならチェックは大変です。やった事が有りません。

    「良いものを持ってこい」だけで始まる仕事がほとんどです。基本的な要求機能を聞き出してプロトタイプを仕立ててから、プロトタイプを動作させながらこまごまと口頭で要求が次々と追加あるいは修正されていきます。プロトタイプ仕立て時にROM・RAM量を一応チェックしますが、かなりの余裕が有る事を確認するだけです。最終的にぎりぎりになる事もしばしばあります。予想が甘いと周辺が足らなくなるので、その場合はネゴです。本来仕様をまとめる営業部門や企画部門はお客様とくだらない雑談で過ごして、開発担当者が忖度してモノを仕上げて、契約書完成の翌日に納入なんてことは良くあります。開発中に必要なROM・RAMを正確にチェックすることは無駄です。どこかの国の競技場建設とか国家予作成などと似ているので当たり前のことなのかなと思うようにしてます。
  • じまさん

     

    おいわです。ご回答ありがとうございます。

    URLを載せていただき、感謝です。ドライバ関係で割込みが使われているので手動計算してみたいと思います。

  • kijoさん

    おいわです。ご回答ありがとうございます。

    少しずつ皆様のおかげで分かってきたと思うのですが、
    左側のsub1の括弧の数字(552):スタックサイズ?
    右側のsub1の括弧の数字(28) :スタックサイズ?
    どちらもスタックサイズなのでしょうか?
    同じスタックに関するものなら同値でないと変ではないかなと思いました。
    (大変初心者レベルですみません)

    >最終的にぎりぎりになる事もしばしばあります。
    おっしゃる通りで、最終的には本当にギリギリか
    超えてしまってSWでなんとかせい!といわれることが多い傾向があります;;
  • mainからsub1が呼び出されるとmainのスタックの上にsub1のスタックが確保されます。さらにsub1がsub2を呼び出すとsub1のスタックの上にsub2のスタックが確保されます。sub2が終了されて続けてsub3が呼び出されると、sub2が使っていたスタック分は開放されてsub1のスタックの上にsub3のスタックが確保されます。右側はsub1、sub2、sub3のそれぞれの関数のスタックサイズです。左側のsub1の()内は呼び出しを考慮してスタックを足し合わせたsub1+sub2とsub1+sub3の大きい方になります。

    右側のsub1の28は関数sub1のサイズです。左側のsub1()内の552はsub1のサイズ28にsub11()内の524を加えたものです。

    「関数が使っている最大スタックサイズ」の意味が違ったようですね。