ESP8266 PlatformIO环境下访问INCBIN嵌入变量报错如何解决?
错误原因
ESP8266采用哈佛架构,存放程序、常量的内置Flash存储区不能通过普通内存指针直接解引用访问,你遇到的LoadStoreError异常就是直接访问Flash地址触发的处理器硬件错误。
INCBIN库会自动将嵌入的文件数据标记为PROGMEM类型存储到Flash区域,因此gmyData指向的是Flash地址,直接执行*gmyData读数据属于非法访问。
解决方法
访问Flash存储区的单字节数据,需要使用ESP8266 Arduino核心提供的pgm_read_byte()专用函数,修改后的示例代码如下:
#include "Arduino.h" #include "incbin.h" INCBIN(my, "path/to/file.someExtension"); void setup() { Serial.begin(9600); Serial.println(); uint8_t firstByte = pgm_read_byte(gmyData); Serial.println(firstByte); } void loop(){}
如果需要批量操作整个嵌入文件的内容,可以用memcpy_P()函数先把Flash数据拷贝到RAM缓冲区再正常访问:
// 获取嵌入文件的总大小 size_t fileTotalSize = gmySize; // 申请对应大小的RAM缓冲区 uint8_t* ramBuf = (uint8_t*)malloc(fileTotalSize); // 把Flash数据拷贝到RAM memcpy_P(ramBuf, gmyData, fileTotalSize); // 后续可直接正常访问ramBuf里的所有数据 free(ramBuf);
如果要将嵌入的证书内容作为字符串传递给其他组件,也可以直接使用strlen_P、strstr_P等PROGMEM专用字符串操作函数,不需要完整拷贝全部数据。
内容的提问来源于stack exchange,提问作者cheiser
相关产品推荐
相关产品推荐

