2016-07-21 449 views
1

目前,我正在與Arduino nano。當我在Arduino IDE中編譯我的c代碼時,出現錯誤。Arduino nano:內存穩定性問題

enter image description here

程序上傳成功並工作正常,那麼什麼原因這個錯誤的背後?這是否真的影響到Arduino nano的性能?

+0

編譯器在運行時無法知道堆棧中的空間局部變量,函數參數和返回地址。如果空間不足,這些將會毫不留情地干擾全局變量。產生完全不可預知的結果。 – datafiddler

+0

這是一個關於沒有足夠空間(通常沒有足夠的堆棧空間)以使程序正常運行的「概率」的警告,您可以通過創建非常廣泛的軟件體系結構而非常有助於程序正常運行,而不是很深。 – user3629249

回答

0

是否真的影響的Arduino納米的性能?

我也得到了同樣的錯誤,而編譯其警告正如你所說的烏爾上傳成功完成,如果完成上傳成功則沒有性能問題。如果你想清除這個錯誤,你需要減少你的代碼的一些內存使用, 只是優化你的代碼,儘可能地使用局部變量。如果有常量,則使用#define代替 組重複調用函數。

+0

通常,** F ** - 宏會消除大部分不必要的RAM損壞。 ** Serial.println(F(「任何常量文本可以保存在珍貴的RAM中)); ** – datafiddler

+1

不要忘記字符串對象,它需要更多的空間並使用動態內存,因此有兩個不穩定的原因。 – datafiddler

+1

>如果您有常量,請使用#define instead_ ...或使用** const **關鍵字。類似的優化效果,但** const **保留數據類型信息。 – datafiddler

2

發生此警告是因爲編譯器不知道您的程序應該分配多少動態內存。請看動態分配,本地變量分配的程序...

是否真的影響arduino nano的性能?

就像它說的「可能會出現穩定性問題」。在過去我確實遇到過這個問題,而且項目在某個時候會滯後。

1
int freeRam() { 
    extern int __heap_start, *__brkval; 
    int v; 
    return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 
} 

調用此函數例如

 Serial.println(freeRam());
在您的功能的最深層次或任何你想要的。

不要使用malloc()或C++新,避免「穩定性問題」,因爲沒有異常處理或其他錯誤在動態內存分配檢查。