たいのですが視覚的にメモリ(SRAM)使用量の削減プログラム?
質問
私た問題は、Cプログラムは、AVRマイクロコントローラ(ATMega328P).いであると考えており、スタック/heap衝突してしまいましたが、まず私が無事を確認することができます。
ができま視覚的にSRAM使用量のスタックのヒープ?
注意: プログラムのようにコンパイルされてavr-gccを使用avr-libc.
更新: 実際の問題をいていますのmallocの実装は不還 NULL
).すべての malloc
ングが起動時に、すべての free
ングさせることができることの申請(実際にはなからの主なアプリケーションの一部は無限ループ).ではあっという断片化は問題ではありません。
解決
というmallocず、NULLを返す:
その原因をしておくとよいでしょう最初は、あなたのヒープが"フル"にしてください.e、メモリまたmallocできな割り当てできません。
あのシナリオを心がけ、それぞれが得意とする
a:また16Kのヒープまでmalloced10Kしい、mallocさ10K.おヒープは単純に小さすぎます。
b:一般的には、16kヒープすべてのバmalloc/無料/realloc電話やヒープ以下50%'full':お電話のmallocのための1Kで失敗した-どうしたの?解答のヒープにフリースペースが分断された-というものはありませんcontigous1K無料でできるメモリを返します。Cヒープ管理者でないコンパクトエディタで開き、ヒープが、まだ一般的に、ひどいことをしている。あ術の断片化が難しい場合には本当の問題です。んを追加する必要があるロギングシムへのmallocや、無料でできることをめざすうための動的メモリ操作を行っています。
編集:
というすべてのmallocsるようになスタートアップなので、断片化できないのではないです。
その場合、このため交換が簡単にダイナミックな割り当てとします。
古いコードの例:
char *buffer;
void init()
{
buffer = malloc(BUFFSIZE);
}
新しいコード:
char buffer[BUFFSIZE];
お客さま人数小児-幼児に行ころ、リンカーは警告するようにその設定でよろしければできない場合のメモリー可能です。なの削減とヒープサイズが注一部のランタイムioシステムの機能がまだ使用のヒープではできない場合がありま取り付けられています。。
他のヒント
チェックできRAM静的利用 avr-size
ユーティリティは、維に
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=62968,
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=82536,
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=95638,
や http://letsmakerobots.com/node/27115
avr-size -C -x Filename.elf
(avr-サイズのドキュメンテーション http://ccrma.stanford.edu/planetccrma/man/man1/avr-size.1.html )
以下の方法について、以下に例を示したことは、IDE:コード::ブロック、プロジェクト->オプションの構築->前後の構築手順->ポストを構築手順が含まれている。
avr-size -C $(TARGET_OUTPUT_FILE)
または
avr-size -C --mcu=atmega328p $(TARGET_OUTPUT_FILE)
例出力の構築:
AVR Memory Usage
----------------
Device: atmega16
Program: 7376 bytes (45.0% Full)
(.text + .data + .bootloader)
Data: 81 bytes (7.9% Full)
(.data + .bss + .noinit)
EEPROM: 63 bytes (12.3% Full)
(.eeprom)
データはSRAM使用だけの量のコンパイラ 知ってコンパイルす。また、部屋のために作成したもので ランタイム(特にスタックにしました。
チェックのスタックの利用(ダイナミックRAM)、 から http://jeelabs.org/2011/05/22/atmega-memory-use/
こちらは小さな光機能を決定付けるかはRAM 現在未使用:
int freeRam () {
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
ここで、この日のスケッチを使用するコード:
void setup () {
Serial.begin(57600);
Serial.println("\n[memCheck]");
Serial.println(freeRam());
}
のfreeRam()関数が返すバイト数の間に存在しのヒープの最後の割り当てられたメモリのスタックで効果的にどのくらいのスタック/ヒープの成長の前にぶつか.
きを確認したり、返却のこの機能周辺コードで被疑者が起こしスタック/heap衝突.
ものという常識をくつがえするためのメモリの既知のパターンをチェックして上書きされます。
使用している場合は、両方のスタックヒープしてからもう少しトリッキー.についてご説明させていただき私がっていないときにヒープを使用します。原則としてすべての企業に働いてきたのドメイン組み込み用Cソフトウェア)などは避けヒープの小型組み込みプロジェクトを避けるため不確実性のヒープメモリの利用が可能。を使用していま静的に宣言された変数です。
一つの方法はほとんどを埋め、スタック領域の既知のパターン例0x55)で開始します。これは、通常は小さなビットコードのソフトウェアの実行は、まさにmain()、そして時には前にmain()が始まりを開始。について上書きに少量のスタック使用時のポイントコースです。その後、後のソフトウェアが検査の内容をスタックスペース、0x55が果たしたのだ。い"検査"によって異なり目標のハードウェアを想定してデバッガに接続したときを止めるわけにはマイクログの読み込みます。
場合はデバッガを使うことができるメモリアクセスをブレークポイント(少ァ以外の通常の実行をブレークポイント)、そのままブレークポイントの設定は、特定のスタックの場所などの最も制限のスタック空間です。できる非常に役に立つでも示しまう少しのコードが実行時に達する範囲のスタック。で求めらデバッガのメモリアクセスをブレークポイントの特徴ではないことが多いから、"低価格"デバッガ.
いものを使用ヒープしてから少し複雑できなくなる可能性があるため、予測がスタックヒープが衝突.
使用しないエディタで開き、ヒープ/ダイナミックな割り当てる組み込みます。特にプロセッサーなど限られた資源をなリデザインアプリケーションから問題の再発防止としてプログラムです。
仮にまでスタック(いなRTOSも、スタックは末のメモリの増減は、ヒープが開始後のBSS/データ領域。私が実装のmallocることを実際に確認しstackpointerとが衝突.きするようにしています。
いない場合は対応できるようにmallocコードを選択できたようにスタックの開始時にメモリを使用してリンカーのファイル).一般では良いアイデアによって定義の最大サイズのスタックです。な場合"ただいま、こんに誤読を超えての初めにアプリです。エディタで開き、ヒープするのではどのように変動するという成長の場であimplemantation(場合は、NULLを返します。良いものはご存知って2つの別々のエラーケース2個別課題です。
の最大スタックサイズは、まだ記憶パターン、アプリケーションを起動し、見どこまで行った、また回答からのクレイグ.
場合を編集することができ、コードのヒープ、パッドでカップルのバイト(トリッキーなど、低リソース)ブロックのメモリを消費します。これらのバイトが含まれているパターンとは異なるスタックです。かもしれませんの手がかりが衝突し、スタックに見なが表示され内部のスタックはます。
Unixのような経営システム図書館機能の名前sbrk()パラメータ0へ自由にアクセスできる、最上位のアドレスを動的に割り当てのヒープメモリ。戻り値はvoid*ポインタとを比較することが可能となるの住所の任意のスタックに割り当て可変となります。
の結果を用いこの比較に注意して使用する必要がある.によってCPUとシステム構築、スタックが増すから、任意の高いアドレスが割り当てて、ヒープの移動から低下。
もに、経営システムの概念のためにメモリ管理(OS/9)、ヒープとスタックの異なるメモリ-セグメントで無料。これらの営業システム-特に組込みシステムを定義する必要があり最大メモリー要件の 用途事前のシステムメモリを割り当てのセグメントのマッチングサイズです。