F()宏用于将全局变量存储在程序存储器(闪存存储器)中而不是动态工作存储器中,因此剩余的空闲存储空间更多。
但是,我偶然发现了这个凌乱的例子……
好的,我是 的 错误 强> 抱歉,F()在内部功能上也很有意义。为了证明这一点,我做了一些测试。
用这个简单的草图进行了一些测试(取消注释你要测试的那个):
// Printing 33 chars // 1. //void printStr() { Serial.println( "0123456789ABCDEFGHo!@#$%^&*()_+<>?" ); } //void printStr() { Serial.println( F("0123456789ABCDEFGHo!@#$%^&*()_+<>?" )); } // 2. void printStr() { String s = "0123456789ABCDEFGHo!@#$%^&*()_+<>?"; Serial.println( s ); } //void printStr() { String s; s+=F("0123456789ABCDEFGHo!@#$%^&*()_+<>?"); Serial.println( s ); } void setup() { Serial.begin(9600); } void loop() { printStr(); delay(1000); }
结果:
的 没有 强> 用于 的 F() 强> 26816个字节
The sketch uses 263136 bytes (25%) of program storage space. Maximum is 1044464 bytes. Global variables use 26816 bytes (32%) of the dynamic memory. Remain 55104 bytes for local variables. Maximum is 81920 bytes.
的 同 强> 用于 的 F() 强> 26788字节
The sketch uses 263212 bytes (25%) of program storage space. Maximum is 1044464 bytes. Global variables use 26788 bytes (32%) of the dynamic memory. Remain 55132 bytes for local variables. Maximum is 81920 bytes.
与F()的-28字节差异。但好吧,现在我们肯定知道了! ;-)
的 背景信息为什么它以这种方式工作: 强>
RAM被分成不同的块以用于不同的目的。有一个存储所有全局和静态变量的块(也就是BSS和数据区域)。存储了函数中创建的局部变量的堆栈,最后是堆,这是存储动态变量的地方。
如果您想了解更多关于这些内存块如何相互关联的信息,您可以阅读更多信息 维基百科 。
信息从此复制 文章 。
这可能是因为这里描述的原因: http://playground.arduino.cc/Learning/Memory
Flash(程序)内存比SRAM可用的内存多得多 使用Arduino语言创建变量时,例如: char message[] = "I support the Cape Wind project."; 您正在复制33个字节(1个字符= 1个字节,加上终止空值) 在使用之前将存储器编程到SRAM中。 33个字节不是很多 内存在1024字节的池中,但如果草图需要一些大的 不变的数据结构 - 例如要发送的大量文本 显示器或大型查找表,例如 - 使用闪存 (程序存储器)直接存储可能是唯一的选择。去做 这个,使用PROGMEM关键字。
Flash(程序)内存比SRAM可用的内存多得多 使用Arduino语言创建变量时,例如:
char message[] = "I support the Cape Wind project.";
您正在复制33个字节(1个字符= 1个字节,加上终止空值) 在使用之前将存储器编程到SRAM中。 33个字节不是很多 内存在1024字节的池中,但如果草图需要一些大的 不变的数据结构 - 例如要发送的大量文本 显示器或大型查找表,例如 - 使用闪存 (程序存储器)直接存储可能是唯一的选择。去做 这个,使用PROGMEM关键字。