2012-07-27 84 views
2

我正在玩字符串SD card(當服務器連接不可用時觸發)。隨後它將傳感器值記錄到SD卡(在常規的loop()函數中),一旦與服務器的連接變爲可用,它就通過UDP將其作爲數據包發送。Arduino內存泄漏(SD卡+字符串)

我似乎遇到了一旦輸入SD卡寫入部分時發生的一些相當大的內存泄漏,最終導致Arduino耗盡可用內存。

+0

你是怎麼確定你有內存泄漏的?我懷疑我可能有類似的問題,但我還沒有'證明'它。想知道你是如何得出你的結論的... – WildBill 2012-12-07 02:42:07

+0

我使用了一段免費的Ram代碼,只是在我的代碼中經常打印它。發生的事情是減少到一個點然後墜毀。 – 2012-12-07 13:44:00

+0

[http://pastebin.com/wUddCd8V](http://pastebin.com/wUddCd8V) – 2012-12-07 13:45:27

回答

2

好吧,我讀了這段代碼 - 如果你不打電話關閉()打開的情況下你會有泄漏 - 只有一個文件對象(爲什麼我不知道) 。

這是一個有趣的代碼:

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對象的代碼,所以它是一個謎,但我希望你需要調用處理東西...也許dataFile?

+0

這將在SD庫中, https://www.dropbox.com/sh/d74i76rngbsa76w/UdxTS_gNxd – 2012-07-27 15:25:38

+0

感謝你,我也發現在我使用的其他庫中有一個巨大的錯誤,尤其是字符串錯誤,因爲arduino沒有自動垃圾收集功能,所以我被告知要在所有地方重寫,並使用它轉儲圖書館。 – 2012-07-27 17:59:02

+0

c和C++沒有自動垃圾收集,因爲它們不是託管語言。 – Hogan 2012-07-27 18:12:30