短字符串是否有限制,使用F()
宏会带来更多的RAM开销然后保存?
对于(一个人为的)例子:
Serial.print(F("\n"));
Serial.print(F("Hi"));
Serial.print(F("there!"));
Serial.print(F("How do you doyou how?"));
如果没有F()
,那么其中任何一个会更有效吗?
我想它会使用一些RAM来迭代字符串并将其从PROGMEM复制到RAM。我想问题是:多少钱?此外,堆碎片是一个问题吗?
我纯粹从保存SRAM的角度来看这个。
答案 0 :(得分:1)
从纯粹的SRAM保护角度来看,所有示例都是相同的,因为没有使用SRAM。在运行时使用一些RAM,但只是暂时在堆栈上。请记住,调用println()
(没有任何参数)会使用一些堆栈/ RAM。
对于单个字符,如果将char
传递到print
或println
,则闪存占用的空间会减少。例如:
Serial.print('\n');
char
将在闪存中(非静态RAM)。
使用
Serial.print(F("\n"));
将在闪存中创建一个长度为两个字节的字符串(换行符char + null终止符),并且还会将指向该字符串的指针传递给print
,这可能是两个字节长。
此外,在运行时,使用F宏将导致两次从闪存中取出(' \ n'和空终止符)。虽然闪存中的提取速度很快,但传入char
会导致闪存零次提取,这会快一点。
答案 1 :(得分:0)
我认为字符串的最小大小没有用处。如果你看看如何在Print.cpp中实现输出:
size_t Print::print(const __FlashStringHelper *ifsh)
{
PGM_P p = reinterpret_cast<PGM_P>(ifsh);
size_t n = 0;
while (1) {
unsigned char c = pgm_read_byte(p++);
if (c == 0) break;
n += write(c);
}
return n;
}
从那里可以看到,一次只使用一个字节的RAM(加上几个变量),因为它一次从PROGMEM中拉出一个字节。这些都在堆栈中,因此没有持续的开销。
我想它会使用一些RAM来迭代字符串并将其从PROGMEM复制到RAM。我想问题是:多少钱?
不,它不像我上面所说的那样。它一次输出一个字节。首先没有将字符串复制(批量)到RAM中。
此外,堆碎片是一个问题吗?
不,代码不使用堆。