Arduino的内存限制

时间:2013-02-02 15:45:08

标签: arduino

我最近买了Arduino Uno,现在我正在试验它。我有几个18B20传感器和一个ENC28J60网络模块连接到它,然后我做了一个草图,允许我从浏览器连接到它,并读取温度作为一个简单的网页或JSON 。使网页的代码如下所示:

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-AVR 4.3.5和GUI 1.6.8的Debian PC上使用AVR Libc v 1.0.1。

4 个答案:

答案 0 :(得分:17)

RAM相当小,因为UNO的328只有2K。你可能只是用完了RAM。我了解到,当它耗尽时,它只是坐在那里。

我建议从这个库中读取readme来获取FreeRAM。它提到了“.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的预期用法。但是,我发现它通常很短,因为它只是估计值。


我还建议您查看Webduino,因为它有一个支持JSON的库。它的例子很快就开始了。但它并不直接支持ENC28J60。

答案 1 :(得分: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;
}

答案 2 :(得分:1)

您可以使用名为memoryFree的小型库来检查内存使用情况。

当存在ram时,您可能正在推动串行缓冲区限制而不是ram限制。如果是这样,您可以在SERIAL_BUFFER_SIZE

中增加HardwareSerial.cpp

(Windows机器上的C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino

但要小心,ram和串行缓冲区都存储在SRAM上。增加串行缓冲区将导致变量的可用内存减少。

为了在arduino上玩JSON,有一个非常好的lib,名为aJson

答案 3 :(得分: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());