5

途中でデバッグできるように、Serial.print("some string text") コマンドを使用して多くのデバッグ メッセージを使用して (Eclipse で) 非常に大きな Arduino プロジェクトを進めています。

私が気づいたことの 1 つは、プロジェクトに含めることができるこれらの数が制限に達していることです。入れすぎると、プログラムは非常に奇妙な場所で停止します。つまり、多くの場合、印刷コマンドの最新の追加が実行されるずっと前です。

私のプロジェクトの .hex ファイルは、現時点で約 20k です。Arduino Uno は 30kb あたりに制限していますよね?したがって、大きすぎてはいけません。

したがって、実際の問題は、おそらくこれらのシリアルコマンドが私の sram をいっぱいにしている可能性があることだと思います。これはわずか2kbです。私は多くのライブラリを使用しています。

コマンド Serial.print("some string text") は SRAM を占有していますか? 確かにgccはこれらの文字列cnstantsをプログラム空間に置きますか? しかし、そうではないでしょうか?

それとも別のものですか?どこかにserial.printバッファがあるという別の理論があり、おそらくメッセージが多すぎるだけです。

4

4 に答える 4

14

はい、文字列はデフォルトでRAMに保存されます。それらもフラッシュメモリにありますが、Arduinoの起動時にRAMにロードされます。

F()ただし、Arduino IDE バージョン 1.0 以降を使用している場合は、マクロを使用して文字列を RAM に読み込まずに、フラッシュから直接文字列を読み取るようにコンパイラに指示できます。

Serial.Println(F("This string is read from Flash!"));

これにより RAM が節約されます。RAM は Flash よりもはるかに少ないため、これは良いことです。詳細については、こちらを参照してください: * http://www.arduino.cc/playground/Main/Printf

于 2012-10-09T21:52:05.103 に答える
3

これは私のコードではありませんが、 http ://www.utopiamechanicus.com/article/low-memory-serial-print/ のソリューション はデバッグに非常に適しています。printf、フラッシュメモリの使用、およびマクロの適切な組み合わせにより、多くの場合、変換は「.」を削除するのと同じくらい簡単です。Serial.print() から。

私は C++ と arduino の完全な初心者ですが、誰かが役に立つことを願っています。

于 2013-07-23T04:18:40.367 に答える
1

文字列を PROGMEM としてマークしてみてください。これにより、文字列がフラッシュに配置されます。Arduino には PROGMEM 用の Serial.write が実装されていないようなので、mem-copy が必要です。詳細については、 http://arduino.cc/en/Reference/PROGMEM (文字列配列) を参照してください。

編集: http://deans-avr-tutorials.googlecode.com/svn/trunk/Progmem/Output/Progmem.pdfは、PROGMEM 引数をうまく説明しています。

于 2012-10-09T20:33:30.597 に答える
0

はい、デフォルトでRAMに保存されます。@Marty のソリューションを使用できます。

または、 MemoryFreeライブラリを使用してメモリを追跡することもできます。

于 2012-10-10T05:38:38.830 に答える