PSoC®アプリケーションにおけるSRAM使用量の制御 - KBA93584 - Community Translated (JA)
- RSS フィードを購読する
- 新着としてマーク
- 既読としてマーク
- ブックマーク
- 購読
- 印刷用ページ
- 不適切なコンテンツを報告
Community Translated by JuIn_1625121 Version: **
Translation - English: Controlling SRAM Usage in PSoC® Applications - KBA93584
質問:
PSoC® アプリケーションでは、予想以上に多くの SRAM を使用している可能性があります。PSoCアプリケーションでSRAMの使用量を制御するにはどうすればよいですか?
回答:
PSoC Creator™では、新規ユーザーがアプリケーション開発を容易にするために、スタックとヒープに大量のSRAMを割り当てています。これにより、新規ユーザが PSoC や PSoC Creator を学習している間に、メモリオーバーフローの問題で不満を感じることを防いでいます。例えば、最上位の CY8C4245AXI-483をターゲットにした新しい PSoC 4 アプリケーションでは、スタックに 1024 バイト、ヒープに 256 バイトが割り当てられています。これは、デバイスで利用可能な総RAMの31%以上を占めます。SRAMの割り当て方法を変更したい場合は、PSoC Creatorで値を変更してアプリケーションを再構築するだけで簡単にできます。
ヒープは、特定のランタイムライブラリ関数、特に sprintf() や malloc() 関数とその関連 API を使用して大量のメモリを確保するアプリケーションで使用されます。動的なメモリ割り当てを使用していない場合、このヒープは無駄なスペースです。これを削除することができます。リソースエディタ(cydwr)のSystemタブで、ヒープのサイズを 0 バイトに変更します。
図1. ヒープとスタックのサイズ設定
スタックは関数の呼び出しに使用されます。関数が呼び出されると、スタックは戻り値のアドレス、呼び出された関数への引数の受け渡し、戻り値のために使用されます。必要なスタックの量は、アプリケーションのネストの深さと、各レベルで渡されるパラメータの数(とタイプ)に依存します。ヒープと同様に、スタックのサイズはリソースエディタのSystemタブで設定します。
アプリケーションの適切なスタック使用量を決定するには、いくつかの方法があります。最初の方法は、ソースコードを見直すことです。スタックスペースを多く使用する関数と、最も深いネスティングが発生している関数を絞り込みます。そこから、最大のスタック使用量を計算することができます。
コンパイラが提供するコマンドラインを使用して、関数ごとのスタック使用量を取得することができます。例えば、GCC コンパイラを使用している場合、-fstack-usage コマンドを追加して、拡張子 .su の追加ファイルを生成し、各関数が使用するスタックの最大量を指定することができます。詳細については、https://gcc.gnu.org/onlinedocs/gnat_ugn/Static-Stack-Usage-Analysis.html を参照してください。
スタックサイズを変更することなく、アプリケーションに少量のコードを追加できるように、計算された最大値に少し余裕を追加します。
2 番目の方法は、より経験則的な方法です。デバッガを使って、使用されているメモリを監視します。まず、スタックをあまり見かけないデータで埋めます。0xFEEDBEEF のような任意の数値は、視覚的に目立ち、アプリケーションがその数値を大量にスタックに書き込む可能性が低いのでうまく機能します。次に、アプリケーションを実行してメモリウィンドウをチェックし、スタックがどれだけ上書きされていないかを確認します。アプリケーションを徹底的に動作させて、すべてのパスが守られているか、スタックの最大使用量が発生しているかどうかを確認することが重要です。
もう一つの方法は、リード/ライト(アクセス)のブレークポイントをスタックの一番下に置き、それに到達したかどうかを確認することです。もし到達していれば、より多くのスタックスペースが必要になります。もしそうでなければ、それがヒットしてピーク時の使用量になるまで、単にそれを上に移動させます。
最後に、サードパーティ製のツールやIDEの中には、ビルトインされたスタックチェック機能を提供しているものがあり、リアルタイム・オペレーティング・システム(RTOS)を使用している場合に特に便利です。このような環境では、各タスクは通常、専用のスタックを持っています。無駄を最小限に抑えるために、それぞれを最適化して下さい。