Arduino内存泄漏(SD卡+字符串)

3
我正在尝试将字符串写入SD卡(在服务器连接不可用时触发)。然后,它会记录传感器值到SD卡中(在常规loop()函数内),一旦与服务器的连接恢复,它就会将其作为数据包通过UDP发送。
似乎当进入SD卡写入部分时出现了一些相当大的内存泄漏,最终导致Arduino的可用内存耗尽。

你是如何确定自己有内存泄漏的?我怀疑我也可能有类似的问题,但我还没有“证明”它。想知道你是如何得出结论的... - WildBill
我使用了一个免费的 RAM 代码块,并在我的代码中定期打印它。结果是它减少到一定程度然后崩溃了。 - Jonny Flowers
http://pastebin.com/wUddCd8V - Jonny Flowers
1
我发现Arduino的字符串函数存在问题,请避免使用它。 - Jonny Flowers
我之前尝试使用那个RAM代码,但是没有成功(检测泄漏),我认为这可能与WiFiShield存在类似的问题有关。除非你断开/重新连接,否则Shield工作得很好。我将检查它的源代码,并根据这个页面上的建议查找字符串。 - WildBill
显示剩余3条评论
1个回答

2

好的,我看了那段代码——如果您没有为每一次打开调用close()函数,您将会有一个泄漏——只有一个文件对象(为什么我不知道)。

以下是有趣的代码:

void File::close() {
  if (_file) {
    _file->close();
    free(_file); 
    _file = 0;

    /* for debugging file open/close leaks
    nfilecount--;
    Serial.print("Deleted ");
    Serial.println(nfilecount, DEC);
    */
  }
}

他们似乎有一些不错的代码可以用来找到漏洞,也许你应该试试。

此外,只需将代码末尾更改为以下形式:

        dataFile = SD.open("datalog.txt", FILE_WRITE);
        // if the file is available, write to it:
        if (SD.open("datalog.txt", FILE_WRITE)) 
        {
              dataFile.println(dataString);
              // print to the serial port too:
              Serial.println("data logged to SD");
        }
        // if the file isn't open, pop up an error:
        else
        {
              Serial.println("File Error datalog.txt");
        } 
        dataFile.close(); // always close after an open.

好的,您没有展示SD对象的代码,所以这是个谜,但我认为您需要在某些东西上调用dispose......也许是dataFile?


这将在SD库中,https://www.dropbox.com/sh/d74i76rngbsa76w/UdxTS_gNxd - Jonny Flowers
谢谢,我也发现我正在使用的另一个库中有一个巨大的bug,特别是字符串库,因为arduino没有自动垃圾回收,所以我被告知要重写我使用它的所有地方并且放弃这个库。 - Jonny Flowers
C和C++没有自动垃圾回收,因为它们不是托管语言。 - Hogan
事实证明,是String库导致了严重的内存泄漏 - 删除它并用字符数组替换所有使用虽然费力但确实奏效。感谢您的帮助 :) - Jonny Flowers
1
我可能错了,但是 @Hogan 在 else 前需要用 close } 关闭 if 块吗? - mxs
@MikeStrand - 很好的发现 -- 已修复。 - Hogan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接