Arduino F():它实际上做了什么

时间:2013-05-16 21:02:48

标签: memory-management arduino

我之前曾问similar question,但我意识到我无法对宏观和模板做出正面或反面。我是C(而不是C ++)程序员。

F()实际上做了什么?什么时候将字符填入pgmem?什么时候从pgmem中拉出角色?它会缓存它们吗?它如何处理低内存情况?

2 个答案:

答案 0 :(得分:25)

没有涉及模板,只有函数重载。 F()宏做了两件事:

  • 使用PSTR来确保文字字符串存储在闪存中(代码空间而不是数据空间)。但是,无法打印PSTR("some string"),因为它会收到一个简单的char *,表示存储在Flash中的字符串的基址。取消引用该指针将访问数据中相同地址的一些随机字符。这也是F()也......

  • 的原因
  • PSTR()的结果转换为__FlashStringHelper*printprintln等函数会被重载,因此在收到__FlashStringHelper*参数时,它们会正确取消引用闪存中的字符。

答案 1 :(得分:0)

顺便说一句。对于ESP32库,这两个函数均在以下文件中定义:

# PSTR :  ../Arduino/hardware/espressif/esp32/cores/esp32/pgmspace.h
# F    :  ../Arduino/hardware/espressif/esp32/cores/esp32/WString.h

和F(x):

// an abstract class used as a means to proide a unique pointer type
// but really has no body
class __FlashStringHelper;
#define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))
...

对于ESP32,也不需要PSTR(x),它只是 x #define PSTR(s) (s)