11

最近ArduinoUnoを購入しましたが、今は少し実験しています。いくつかの18B20センサーとそれに接続されたENC28J60ネットワークモジュールがあります。次に、ブラウザーから接続して、単純なWebページまたはJSONとして温度を読み取ることができるようにスケッチを作成しています。Webページを作成するコードは次のようになります。

client.print("Inne: ");
client.print(tempin);
client.println("<br />");
client.print("Ute: ");
client.print(tempout);
client.print("<br /><br />");
client.println(millis()/1000);
//    client.print("<a href=\"/json\">j</a>");

奇妙なことに、最後の行のコメントを外すと、スケッチは正常にコンパイルされ、正常にアップロードされますが、ボードに接続できません。他のいくつかのプリントアウトにさらにいくつかの文字を追加しても、同じことが起こります。したがって、ある種のメモリ制限に直面しているように見えます(スケッチの合計サイズは約15 KBであり、コードの他の場所で使用されている他の文字列があります-はい、私は書き直します配列を使用して一時的なものを格納するために、例からいくつかのコードを盗んだだけです)。

Arduinoに文字列を保存するために使用できるメモリの量に制限はありますか?それを回避する方法はありますか?(GCC-AVR4.3.5およびAVRLibc1.6.8を搭載したDebianPCでGUIv 1.0.1を使用)。

4

4 に答える 4

17

UNOの328はわずか2Kであるため、RAMはかなり小さいです。RAMが不足している可能性があります。それがなくなると、それはただそこに座っているだけだということを私は学びました。

FreeRAMを入手するには、このライブラリのreadmeを読むことをお勧めします。「.print」がRAMとROMの両方をどのように消費できるかについて説明しています。

私はいつも(Arduino IDE 1.0。+の場合)を使用しています

Serial.print(F("HELLO"));

Serial.print("HELLO");

RAMを節約するので、これはlcd.printにも当てはまります。私がいつも置くところ

Serial.println(freeMemory(), DEC);  // print how much RAM is available.

コードの冒頭で、注意を払ってください。実際のコードを実行し、そのサブルーチンに再度呪うための余地が必要であることに注意してください。

1.0.0より前のIDEの場合、ライブラリはgetPSTR()を提供します。

IDE 1.0.3は、コンパイルの最後にRAMの予想使用量の表示を開始します。ただし、これは単なる見積もりであるため、短いことがよくあります。


また、JSONをサポートするライブラリがあるWebduinoを確認することをお勧めします。その例はすぐに始められます。ただし、ENC28J60を直接サポートしていません。

于 2013-02-02T17:52:06.713 に答える
2

次のコードを使用して、使用可能なRAMを解放します

int getFreeRam()
{
  extern int __heap_start, *__brkval; 
  int v;

  v = (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);

  Serial.print("Free RAM = ");
  Serial.println(v, DEC);

  return v;
}
于 2014-11-17T08:38:01.820 に答える
1

memoryFreeと呼ばれる小さなライブラリでメモリ使用量を確認できます。

RAMが残っている場合は、RAM制限ではなくシリアルバッファ制限をプッシュしている可能性があります。もしそうなら、あなたは増加することができSERIAL_BUFFER_SIZEますHardwareSerial.cpp

C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduinoWindowsマシンの場合)

ただし、RAMとシリアルバッファはどちらもSRAMに保存されているので注意してください。シリアルバッファを増やすと、変数に使用できるメモリが少なくなります。

arduinoでJSONを操作するために、 aJsonと呼ばれる本当に素晴らしいlibがあります。

于 2013-10-07T13:58:14.330 に答える
0

この関数を追加し、セットアップとループで時々呼び出して、RAMが使い果たされていないことを確認します。

// Private function: from http://arduino.cc/playground/Code/AvailableMemory  
int freeRam () {
  extern int __heap_start, *__brkval; 
  int v; 
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 
}

たとえば、プリント内で呼び出す必要があります。Serial.println(freeRam());

于 2014-10-31T08:08:57.553 に答える