3

SDカードに文字列を書き込んで遊んでいます(サーバー接続が利用できないときにトリガーされます)。その後、センサー値を SD カードに記録し (通常のloop()関数内)、サーバーへの接続が利用可能になると、これを UDP 経由のパケットとして送信します。

このSDカード書き込みセクションに入ると、かなり大きなメモリリークが発生しているようで、最終的にArduinoの空きメモリが不足します。

4

1 に答える 1

2

わかりました、そのコードを読みました.openのすべてのケースでclose()を呼び出さないと、リークが発生します.1つのファイルオブジェクトしかありません(なぜわからないのですか)。

興味深いコードは次のとおりです。

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?

于 2012-07-27T15:13:52.130 に答える