【问题标题】:Memory limits on ArduinoArduino 的内存限制
【发布时间】:2013-02-02 15:45:08
【问题描述】:

我最近买了一个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 和 AVR Libc 1.6.8 的 Debian PC 上使用 GUI v 1.0.1)。

【问题讨论】:

    标签: arduino


    【解决方案1】:

    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。

    【讨论】:

    • “就在那里”是的,完全正确。谢谢!我会检查你的建议
    • “F”技巧非常出色,修复了串行打印的许多奇怪错误。
    【解决方案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;
    }
    

    【讨论】:

      【解决方案3】:

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

      当剩余内存时,您可能会推动串行缓冲区限制而不是内存限制。如果有,可以在HardwareSerial.cpp中增加SERIAL_BUFFER_SIZE

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

      但请注意,ram 和串行缓冲区都存储在 SRAM 上。增加串行缓冲区会导致变量的可用内存减少。

      对于在 arduino 上玩 JSON,有一个非常好的库,称为 aJson

      【讨论】:

      【解决方案4】:

      添加此函数并在设置中调用它,并且不时在循环中调用它,以确保 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); 
      }
      

      例如,您需要在 print 中调用它: Serial.println(freeRam());

      【讨论】:

        猜你喜欢
        • 2013-02-14
        • 1970-01-01
        • 1970-01-01
        • 2010-09-26
        • 2012-01-06
        • 2017-11-15
        • 1970-01-01
        • 2014-07-16
        • 2011-02-25
        相关资源
        最近更新 更多