2012-10-09 44 views
4

我有一個相當大的Arduino項目(在eclipse中)使用Serial.print(「some string text」)命令繼續進行大量調試消息,以便我可以一路調試。Arduino:命令Serial.print(「一些字符串文本」)佔用SRAM?

我注意到的一件事是,我達到了這些項目中可以有多少項目的限制。如果我把太多,程序停在非常奇怪的地方。即:在我最新添加的打印命令應該執行之前。

我的項目.hex文件目前大約爲20k。 Arduino Uno限制在30kb左右? 所以它不應該太大。

所以我覺得實際的問題可能是這些串行命令填滿了我的sram。這只是2kb。我正在使用很多庫。

命令Serial.print(「一些字符串文本」)佔用SRAM? 當然gcc把這些字符串cnstants是在程序空間?但也許他們不是?

還是別的東西?我有另一種理論認爲在某處有一個serial.print緩衝區,我可能只是填充了太多的消息。

+1

+1。我在AVR上遇到了同樣的問題。但是請注意,從閃存讀取比從RAM讀取要慢,所以也許你會找到一個很好的平衡,或許可以將最需要的字符串保存在RAM中等等。 – glglgl

+0

謝謝,這也很好。解釋爲什麼默認情況下它不保存在SRAM之外。 – SpiRail

+0

這不是唯一的原因。訪問RAM要容易得多;訪問Flash通常需要額外的工作。 – glglgl

回答

11

是的,字符串默認存儲在RAM中。雖然他們也在閃存中,但是在Arduino啓動時它們被加載到RAM中。

但是,如果您使用的Arduino IDE 1.0或更高版本,你可以告訴編譯器直接從閃存而不是讀字符串來打擾他們加載到RAM與F()宏:

Serial.Println(F("This string is read from Flash!")); 

這將節省RAM是一件好事,因爲內存比Flash少得多。在這裏看到更多的細節: * http://www.arduino.cc/playground/Main/Printf

+0

非常好。我會盡快嘗試。 我使用eclipse(而不是原始的arduino ide),我認爲我添加arduino.h的事實足以讓我使用這個函數? – SpiRail

+0

@SpiRail:我不知道... – Marty

+1

我有一個相關的問題:可以說我已經定義了一個調試打印功能爲「#define調試(M)Serial.print(」調試:「);串行。 println((M))「 - 字符串」Debug:「的每個實例是否會佔用更多內存?我應該將此字符串設置爲全局變量嗎? – vitiral

0

是的,它得到的默認存儲在RAM中。您可以通過@Marty使用解決方案。

或者,您也可以使用MemoryFree庫來跟蹤您的記憶。

3

這不是我的代碼,但我發現,在該解決方案: http://www.utopiamechanicus.com/article/low-memory-serial-print/ 對於調試非常好。一個體面的printf,閃存使用和宏的組合,所以轉換通常就像刪除'。'一樣簡單。來自Serial.print()。

雖然我是C++和arduino的總noobot,但希望有人認爲它有用。