我有一个很大的Arduino项目(在eclipse中)使用Serial.print(“一些字符串文本”)命令继续执行大量调试消息,以便我可以一路调试。
我注意到的一件事是,我在项目中可以拥有多少这样的限制。如果我放太多,程序会在非常奇怪的地方停止。 即:通常在我最新添加打印命令之前很久就会执行。
我的项目.hex文件目前约为20k。 Arduino Uno限制在30kb左右吗? 所以它不应该太大。
所以我觉得实际问题可能是这些串行命令可能填满了我的sram。这只是2kb。我使用了很多库。
命令Serial.print(“some string text”)是否占用SRAM? 当然gcc把这些字符串cnstants放在程序空间中?但也许他们不是?
还是别的什么?我有一个替代理论,在某处有一个serial.print缓冲区,我可能只是填充了太多的消息。
答案 0 :(得分:13)
Yup,字符串默认存储在RAM中。虽然它们也在Flash存储器中,但是当Arduino启动时它们被加载到RAM中。
但是,如果您使用Arduino IDE 1.0或更高版本,您可以告诉编译器直接从Flash读取字符串,而不是使用F()
宏将它们加载到RAM中:
Serial.Println(F("This string is read from Flash!"));
这将节省RAM,这是一件好事,因为RAM比Flash要少得多。有关详细信息,请参见此处 * http://www.arduino.cc/playground/Main/Printf
答案 1 :(得分:3)
这不是我的代码,但我发现解决方案在: http://www.utopiamechanicus.com/article/low-memory-serial-print/ 非常适合调试。 printf,闪存使用和宏的良好组合,因此转换通常就像删除'。'一样简单。来自Serial.print()。
我是C ++和arduino的总菜鸟,希望有人觉得它很有用。
答案 2 :(得分:1)
请尝试将字符串标记为PROGMEM,它应将它们放在闪存中。 Arduino似乎没有为PROGMEM实现Serial.write,因此需要一个mem-copy。有关详细信息,请参阅http://arduino.cc/en/Reference/PROGMEM(字符串数组)。
编辑:http://deans-avr-tutorials.googlecode.com/svn/trunk/Progmem/Output/Progmem.pdf很好地解释了PROGMEM的论点。
答案 3 :(得分:0)
是的,它默认存储在RAM中。您可以使用@Marty的解决方案。
或者,您也可以使用MemoryFree库来记录您的记忆。