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

ite*_*ter 17 memory-management arduino

我之前曾问过类似的问题,但我意识到我无法对宏观和模板做出正面或反面.我是一名C(而不是C++)程序员.

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

use*_*342 26

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

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

  • 投下的结果PSTR()__FlashStringHelper*.诸如printprintln重载的函数,以便在接收__FlashStringHelper*参数时,它们正确地取消引用闪存中的字符.


not*_*bit 6

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

# PSTR :  ../Arduino/hardware/espressif/esp32/cores/esp32/pgmspace.h
# F    :  ../Arduino/hardware/espressif/esp32/cores/esp32/WString.h
Run Code Online (Sandbox Code Playgroud)

以及 F(x):

// An abstract class used as a means to provide a unique pointer type
// but really has no body
class __FlashStringHelper;
#define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))
...
Run Code Online (Sandbox Code Playgroud)

同样对于 ESP32,PSTR(x)不需要,只是x : #define PSTR(s) (s)