マイクロコントローラ (Cortex-M3) で実行される C アプリケーションのコール ツリーを作成するためのツールを知っている人はいますか? ソース コード (理想的ではない)、オブジェクト コード (望ましいソリューション)、または実行時 (許容範囲) から生成できます。gprof を見てきましたが、組み込みシステムで動作させるにはまだ多くのことが欠けています。
追加のボーナスは、ツールが最大スタック深度も提供することです。
更新:ソリューションはできれば無料です。
マイクロコントローラ (Cortex-M3) で実行される C アプリケーションのコール ツリーを作成するためのツールを知っている人はいますか? ソース コード (理想的ではない)、オブジェクト コード (望ましいソリューション)、または実行時 (許容範囲) から生成できます。gprof を見てきましたが、組み込みシステムで動作させるにはまだ多くのことが欠けています。
追加のボーナスは、ツールが最大スタック深度も提供することです。
更新:ソリューションはできれば無料です。
これを実現する良い方法の 1 つは--callgraph
、RVCT の一部である ARM リンカ (armlink) のオプション (無料ではない) を使用することです。
詳細については、callgraph のドキュメントを参照してください。
コメントの 1 つから、gcc ベースのソリューションを探していることがわかりましたが、これはそうではありません。しかし、それはまだ役立つかもしれません。
Doxygenを使用してコードを文書化していない場合でも、ソース コードからDoxygenとGraphVizを使用できます。ドキュメント コメントの有無にかかわらず、すべての関数とメソッドが含まれるように構成することができます。AT&T Graphviz をインストールすると、Doxygen にはほとんどの関数とメソッドの呼び出しグラフと呼び出し元グラフが含まれます。
オブジェクト コードからは、すぐに答えはわかりません。デバッグ情報が存在する場合でも、呼び出しや他のスタック ユーザーを見つけるためにオブジェクト コードを解析する必要があるため、これはターゲットに大きく依存すると思います。最悪の場合、そのアプローチはターゲットを効果的にシミュレートする必要があるようです.
ターゲット ハードウェアでの実行時の選択は、存在する組み込み OS の種類と、各スレッドのスタックの管理方法に部分的に依存します。
一般的なアプローチは、自動変数に一般的に保存される可能性が低いと思われる既知の値に各スタックを初期化することです。次に、割り込みハンドラーまたはスレッドがスタックを検査し、おおよその最高水準点を測定できます。
スタックを事前に埋め、後でフットプリントを探すためにそれをウォークしなくても、割り込みはスタック ポインターの現在の値を (スレッドごとに) サンプリングし、観測された最大範囲の記録を保持することができます。これには、各スレッド SP のコピー用のストレージが必要であり、割り込みハンドラーには、情報を維持するために行う作業があまりありません。もちろん、すべてのアクティブなスレッドの保存された状態にアクセスする必要があります。
これを明示的に行うツールを知りません。
Micriumの µC/OS-II を OSとして使用している場合は、同社の µC/Probe 製品を検討してみてください。私自身は使用していませんが、接続された PC がプログラムと OS の状態情報をほぼリアルタイムで観察できると主張しています。必要に応じて、別の RTOS に適応できても驚かないでしょう。
上記のように、ソース コードからのコール グラフは問題ありません。コンパイラまたは doxygen は、ソース コードからこの情報を生成できます。最新のコンパイラのほとんどは、コンパイル プロセスの一部としてコール グラフを生成できます。
以前の組み込みプロジェクトでは、そのスタックをパターンで埋めてタスクを実行しました。スタックがどの時点までパターンを破壊したかを確認してください。パターンでスタックをリロードし、次のタスクを実行します。これにより、コードが非常に ssslloowww .... になりますが、無料です。すべてのデータが常にタイムアウトしており、コードがエラー ハンドラーで多くの時間を費やしているため、完全に正確ではありません。
一部のプロセッサでは、コード カバーを監視できるようにトレース ポッドを取得できます。また、テストのためにプロセッサをフル スピードで実行する必要があり、インストルメント化されたコードを使用できない場合はどうすればよいでしょうか。残念ながら、これらのタイプのツールは非常に高価です。お金があれば、グリーンヒルズのタイムマシンを見てください。これにより、あらゆる種類のデバッグが容易になります。
StackAnalyzerをチェックしてください。
私はこれらを使用していませんが、ご存知ですか:
ソースコードを分析するため、スタックの深さを計算しません。
Doxygenは「呼び出しグラフ」と「呼び出し元グラフ」を実行できますが、これらは関数ごとであり、各関数から特定の数の「ホップ」までのツリーのみを表示すると思います。
スタックの深さおよび/またはコール ツリーの生成は、コンパイラ ツールでサポートされている場合があります。たとえば、Renesas micros にはCall Walkerというユーティリティがあります。
cscope と dot を使用して、bash で実装されたコールツリー グラフ ジェネレーター。
上流の呼び出し元、下流の呼び出し先、および関数間の呼び出し関連付けのグラフを生成できます。xfig、.png ビューア、動的ドット視覚化ツール「zgrviewer」など、さまざまな方法でグラフを表示するように設定できます。
http://toolchainguru.blogspot.com/2011/03/c-calltrees-in-bash-revisited.html
ちょっとした考え。仮想マシン (Valgrind など) で実行して、スタック サンプルを取得することはできますか?
理解を使用する:http ://www.scitools.com/
これは無料ではなく、ソース(ランタイムではない)で実行されますが、機能し、適切に機能し、十分にサポートされています。
それはあなたのコードについて知りたいと思うよりもはるかに多くのことを教えてくれます。
かなり軽いツール:エジプト