Arduino:导致异常的 PROGMEM malloc() 问题

Arduino: PROGMEM malloc() issue causing exception

我正在尝试为存储在闪存中的字符指针动态分配内存。

我需要使用 LittleFS 文件系统从闪存中读取文件并将其复制到字符数组,该字符数组也需要使用 PROGMEM 存储在闪存中。由于 space 有限,我无法将其存储在 RAM 中。此外,我不能直接在草图中对字符数组进行硬编码,因为我需要能够在运行时更改文件并使其在重启后保持不变。

如果我不使用 PROGMEM 作为字符指针,草图工作正常。但是加入PROGMEM会导致ESP8266抛出异常重启,变成死循环。这是一个简化的草图,展示了我正在努力实现的目标。

#include "LittleFS.h"
char* arr PROGMEM;
void setup() {
  Serial.begin(115200);
  LittleFS.begin();
  
  File file = LittleFS.open("/test.txt","r");
  arr = (char*)malloc(file.size()+sizeof(char));
  int len = file.size()/sizeof(char);
  for(int i = 0; i < len; i++){
    arr[i] = file.read();
  }
  arr[len] = '[=10=]';

  while(1){
    Serial.println(arr);
    delay(1000);
  }
}
void loop(){}

它用于 WifiClientSecure 库。 class 是 BearSSL::X509List。要为此 class 创建一个对象,我需要将一个 char 指针作为参数发送给构造函数。字符指针应包含 SSL 证书字符串的地址。我的 SSL 证书在草图数据文件夹中为“ca.crt”。

PROGMEM 在构建时由链接器处理。链接器将数组定位到闪存地址 space。只有常量可以使用 PROGMEM 指令。

malloc 分配堆内存,这是动态 RAM 中的地址范围。可以像 LittleFS 库那样在运行时写入闪存,但 malloc 无法做到这一点。

边读边处理文件。按照您计划处理从文件中读取的数组的方式执行此操作。


对于 WifiClientSecure,您可以将 LittleFS 的证书与 CertStoreBearSSL 一起使用。