5

我有一个相当大的 Arduino 项目(在 eclipse 中)使用 Serial.print("some string text") 命令进行大量调试消息,以便我可以一路调试。

我注意到的一件事是我在项目中可以拥有多少这样的限制。如果我放太多,程序会在非常奇怪的地方停止。即:通常在我最新添加的打印命令应该执行之前很久。

我的项目 .hex 文件目前大约 20k。Arduino Uno 限制在 30kb 左右,对吧?所以它不应该太大。

所以我觉得实际的问题可能是这些串行命令正在填满我的 sram。这只有 2kb。我正在使用很多库。

命令 Serial.print("some string text") 是否占用 SRAM?gcc 肯定会将这些字符串 cnstants 放在程序空间中吗?但也许他们不是?

或者是别的什么?我有另一种理论,即某处有一个 serial.print 缓冲区,我可能只是用太多消息填充它。

4

4 回答 4

14

是的,字符串默认存储在 RAM 中。虽然它们也在闪存中,但是当 Arduino 启动时它们被加载到 RAM 中。

F()但是,如果您使用 Arduino IDE 1.0 或更高版本,您可以告诉编译器直接从 Flash 读取字符串,而不是使用宏将它们加载到 RAM 中:

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

这将节省 RAM,这是一件好事,因为 RAM 比 Flash 少得多。有关详细信息,请参见此处:* http://www.arduino.cc/playground/Main/Printf

于 2012-10-09T21:52:05.103 回答
3

这不是我的代码,但我发现: http ://www.utopiamechanicus.com/article/low-memory-serial-print/ 的解决方案 非常适合调试。printf、闪存使用和宏的体面组合,因此转换通常像删除“。”一样简单。来自 Serial.print()。

不过,我对 C++ 和 arduino 完全是个菜鸟,希望有人觉得它有用。

于 2013-07-23T04:18:40.367 回答
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 参数。

于 2012-10-09T20:33:30.597 回答
0

是的,它默认存储在 RAM 中。您可以使用@Marty 的解决方案。

或者,您也可以使用MemoryFree库来跟踪您的记忆。

于 2012-10-10T05:38:38.830 回答