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



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

我需要使用LittleFS文件系统从闪存中读取一个文件,并将其复制到一个字符数组中,该数组也需要使用PROGMEM存储在闪存中。由于空间有限,我无法将其存储在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] = '';
while(1){
Serial.println(arr);
delay(1000);
}
}
void loop(){}

它用于WifiClientSecure库。类是BearSL::X509List。要为这个类创建一个对象,我需要向构造函数发送一个char指针作为参数。char指针应包含SSL证书字符串的地址。我在草图数据文件夹中有我的SSL证书作为"SSL证书";ca.crt";。

PROGMEM在构建时由链接器处理。链接器将阵列定位到闪存地址空间中。只有常量才能使用PROGMEM指令。

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

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


对于WifiClientSecure,您可以使用带有CertStoreBearSSL的LittleFS证书。

最新更新