SDカードに文字列を書き込んで遊んでいます(サーバー接続が利用できないときにトリガーされます)。その後、センサー値を SD カードに記録し (通常のloop()
関数内)、サーバーへの接続が利用可能になると、これを UDP 経由のパケットとして送信します。
このSDカード書き込みセクションに入ると、かなり大きなメモリリークが発生しているようで、最終的にArduinoの空きメモリが不足します。
SDカードに文字列を書き込んで遊んでいます(サーバー接続が利用できないときにトリガーされます)。その後、センサー値を SD カードに記録し (通常のloop()
関数内)、サーバーへの接続が利用可能になると、これを UDP 経由のパケットとして送信します。
このSDカード書き込みセクションに入ると、かなり大きなメモリリークが発生しているようで、最終的にArduinoの空きメモリが不足します。
わかりました、そのコードを読みました.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?