プロセッサで利用可能なメモリの限界を押し上げているかなり大きなArduinoスケッチがあります。私はメモリを解放し、グローバル変数の使用を可能な限り減らしています。使用可能なメモリを確認するために使用していMemoryFree.h
ます(詳細はここにあります)。作業中のスケッチがありますが(ここに投稿するには長すぎます)、いくつかの変数(使用可能なメモリの範囲内)を使用して別の関数を追加すると、メモリがないためにシステムがクラッシュまたは停止します。
次の関数を追加しました。
boolean moved(){
int yreadings[4];
int zreadings[4];
free(&yreadings);
free(&zreadings);
}
次に、メインループに次のコードを追加しました。
Serial.print("Mem is ");
Serial.println(freeMemory());
moved();
ループ内で以下の関数全体がコメント化されている場合moved()
、次の出力が得られます。
Mem is 499
各反復で、反復ごとにメモリが失われないことを示します。
しかし、関数とその呼び出しのコメントを外すと、次の出力が得られます。
Mem is 499
Mem is -16094
クラッシュする前の1行目と2行目...
メモリが永続的であっても、これは反復ごとに499バイト全体よりもはるかに少ない量を使用するべきではありませんか?それでも、どのようにしてメモリを失うのですか?
更新:さらに奇妙なことに、moved()関数を削除して整数配列をグローバルに宣言すると、まだ499のメモリ読み取り値が得られます。どうですか?24個の整数が消費するメモリの量だけ減らすべきではありませんか?