【问题标题】:Arduino: PROGMEM malloc() issue causing exceptionArduino:PROGMEM malloc() 问题导致异常
【发布时间】:2021-12-25 05:41:09
【问题描述】:

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

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

如果我不使用 PROGMEM 作为 char 指针,则草图可以正常工作。但是添加 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] = '\0';

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

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

【问题讨论】:

    标签: c++ arduino arduino-esp8266


    【解决方案1】:

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

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

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


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

    【讨论】:

    • 感谢您的澄清。我不打算处理阵列。我只需要 char 数组中的文件内容将其作为参数传递给另一个函数。而且由于空间有限,我不能在 RAM 中拥有 char 数组。所以唯一的选择是在闪存中使用 char 数组。
    • 如果函数不支持从闪存读取,则无法将其从闪存传递给函数。它是什么功能?你的还是图书馆?如果你的,修改它以从文件中读取。如果来自库,则查看该函数是否有其他变体,可以从文件或流中读取。
    • 它是 WifiClientSecure 库。班级是BearSSL::X509List。要为这个类创建一个对象,我需要将一个 char 指针作为参数发送给构造函数。 char 指针应包含 SSL 证书字符串的地址。我在草图数据文件夹中有我的 SSL 证书作为“ca.crt”。
    • 您不能为此使用 CertStoreBearSSL 吗?
    • 我不知道它存在。感谢您为我指明正确的方向。我将介绍它是如何实现的,并为这个问题创建另一个答案,以帮助任何可能对此感到困惑的人。谢谢。
    猜你喜欢
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多