F()的最小字符串长度是否有用?

时间:2015-08-23 14:44:06

标签: arduino

短字符串是否有限制,使用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的角度来看这个。

2 个答案:

答案 0 :(得分:1)

从纯粹的SRAM保护角度来看,所有示例都是相同的,因为没有使用SRAM。在运行时使用一些RAM,但只是暂时在堆栈上。请记住,调用println()(没有任何参数)会使用一些堆栈/ RAM。

对于单个字符,如果将char传递到printprintln,则闪存占用的空间会减少。例如:

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中。

  

此外,堆碎片是一个问题吗?

不,代码不使用堆。