4

I would like to be able to debug how much total memory is being used by C program in a limited resource environment of 256 KB memory (currently I am testing in an emulator program).

I have the ability to print debug statements to a screen, but what method should I use to calculate how much my C program is using (including globals, local variables [from perspective of my main function loop], the program code itself etc..)?

A secondary aspect would be to display the location/ranges of specific variables as opposed to just their size.

-Edit- The CPU is Hitachi SH2, I don't have an IDE that lets me put breakpoints into the program.

4

3 に答える 3

3

IDE オプションを使用すると、ビルド プロセス (つまり、リンカー) がマップ ファイルを生成するように、適切なアクションが作成されます (おそらく checkobx をマークします)。組み込みシステムのマップ ファイルは、通常、必要な情報を詳細に提供します。メモリ セグメント、そのサイズ、それぞれのメモリ使用量、プログラム メモリ、データ メモリなどです。必要なものを正確に計算するスクリプトを作成するか、Excel にコピーする必要がある場合があります。マップ ファイルには、概要情報が含まれている場合もあります。

スタックは少しトリッキーです。マップファイルがそれを示している場合は、そこにあります。そうでない場合は、自分で見つける必要があります。通常、組み込みコンパイラでは、スタックの場所とサイズを定義できます。プログラムの先頭にブレークポイントを置きます。アプリケーションがそこで停止すると、スタック全体がゼロになります。アプリケーションを再開し、しばらく動作させます。最後に停止し、スタック メモリを調べます。ゼロの代わりにゼロ以外の値が表示されます。使用済みスタックは、ゼロの部分が再び始まるまで続きます。

于 2012-06-03T16:24:46.410 に答える
0

ローカル変数はいつでも(スコープに出入りするときに)多少のスペースを占める可能性がありますが、スタック上でインスタンス化されます。シングルスレッド環境では、スタックはリンク時に既知の固定割り当てになります。静的に割り当てられたすべてのデータについても同じことが言えます。唯一の実行時変数partidは動的に割り当てられたデータですが、それでも、ほとんどのベアメタルのシングルスレッド環境では固定リンク時間割り当てであるヒープからsichデータが割り当てられます。

したがって、メモリ割り当てに関して必要なすべての情報は、おそらくリンカによってすでに提供されています。多くの場合(使用するツールチェーンとリンカーパラメーターによって異なります)、リンカーの実行時に基本情報が出力されます。通常、完全なリンカーマップファイルの生成を要求できます。これにより、詳細情報が得られます。一部のリンカは、特定の関数の最悪の場合のスタック使用量を提供するスタック使用量分析を実行できます。シングルスレッド環境では、main()からのスタックの使用により、全体的な使用が最悪の場合になります(ただし、割り込みハンドラーを考慮する必要がありますが、リンカーはスレッドまたは割り込みに対応しておらず、一部のアーキテクチャには個別の割り込みスタックがあり、一部は共有されています)。

ヒープ自体は通常、固定割り当てですが(多くの場合、リンカーがスタックと静的データの静的割り当てを実行した後、使用可能なすべてのメモリ)、動的メモリ割り当てを使用している場合は、実行時にメモリの量を知ることが役立つ場合があります。ヒープから割り当てられただけでなく、割り当ての数、割り当ての平均サイズ、および空きブロックの数とそのサイズに関する情報もあります。動的メモリ割り当てはシステムの標準ライブラリによって実装されるため、このような分析機能はライブラリに固有のものであり、まったく提供されない場合があります。ライブラリソースがあれば、そのような機能を自分で実装できます。

マルチスレッド環境では、スレッドスタックは静的に、またはヒープから割り当てられますが、どちらの方法でも、上記と同じ分析方法が適用されます。スタック使用状況分析の場合、各スレッドのワーストケースは、main()からではなく、各スレッドのエントリポイントから測定されます。

于 2012-06-04T09:21:02.480 に答える
0

通常、mmap で生成されたファイルには、次のようにデータが格納されるさまざまなセクションがあります

.intvect_end
.rozdata
.robase
.rosdata
.rodata
.text ....など!!!

各セクションの Base、Size(hex)、Size(dec) などの他の属性を使用します。

于 2012-06-03T19:21:28.557 に答える