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 一起使用。
我正在尝试为存储在闪存中的字符指针动态分配内存。
我需要使用 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 一起使用。