Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Arduino:命令Serial.print(“一些字符串文本”)是否占用SRAM?_C++_Arduino_Ram - Fatal编程技术网

C++ Arduino:命令Serial.print(“一些字符串文本”)是否占用SRAM?

C++ Arduino:命令Serial.print(“一些字符串文本”)是否占用SRAM?,c++,arduino,ram,C++,Arduino,Ram,我有一个相当大的Arduino项目(在eclipse中)正在使用Serial.print(“一些字符串文本”)命令处理大量调试消息,以便在调试过程中进行调试 我注意到的一件事是,我在项目中可以拥有的数量达到了极限。如果我放的太多,程序会在非常奇怪的地方停止。 Ie:通常在我最新添加的打印命令应该执行之前很久 我的project.hex文件目前大约是20k。Arduino Uno限制在30kb左右,对吗? 所以它不应该太大 所以我觉得实际的问题可能是这些串行命令填满了我的sram。这只是2kb。我

我有一个相当大的Arduino项目(在eclipse中)正在使用Serial.print(“一些字符串文本”)命令处理大量调试消息,以便在调试过程中进行调试

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

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

所以我觉得实际的问题可能是这些串行命令填满了我的sram。这只是2kb。我使用了很多图书馆

命令Serial.print(“某些字符串文本”)是否占用SRAM? gcc确定这些字符串CNSTANT在程序空间中吗?但也许他们不是


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

请尝试将字符串标记为PROGMEM,这样可以将它们放在flash中。Arduino似乎没有为PROGMEM实现Serial.write,因此需要一个mem副本。有关详细信息,请参见(字符串数组)


编辑:很好地解释了PROGMEM参数

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

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

Serial.Println(F("This string is read from Flash!"));
这将节省内存,这是一件好事,因为内存比闪存少得多。有关更多详细信息,请参见此处:
*

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


或者,您也可以使用库来跟踪内存。

这不是我的代码,但我发现解决方案位于: 这对调试是非常好的。printf、闪存使用和宏的合理组合,因此转换通常与从Serial.print()中删除“.”一样简单


我是C++和ARDUINO的总称,希望有人认为它有用。< /P> + 1。我在AVR上也有同样的问题。但是请注意,从闪存读取的速度比从RAM读取的速度慢,因此,您可能会找到一个很好的平衡,也许可以将最需要的字符串保留在RAM中。谢谢,这也是很好的了解。解释为什么默认情况下SRAM不会保留它。这不是唯一的原因。访问RAM要容易得多;访问Flash通常需要额外的工作。非常好。我会尽快试试这个。我使用的是eclipse(而不是原始的arduino ide),我假设我添加arduino.h的事实足以让我使用这个函数?我有一个相关的问题:假设我已经定义了一个调试打印函数为“#define debug(m)Serial.print”(“debug:”;Serial.println((m))--字符串的每个实例是否都是“debug:”占用更多内存?我应该将这个字符串设置为全局变量吗?我回答了我自己的问题,它确实是:这很有趣!祝福你善良的先生告诉我们这个神奇的
F()
宏!