场景:
在写ESP8266 web服务的时候,免不了要将自己设计的网页html和css等文件放入到固件中。在arduino中有fs可以进行上传文件,然后通过文件系统读出。那在ESP-IDF中该怎么办呢。有几个思路
1. 通过flash_download_tools 直接向固定地址写入文件。然后在代码中读出来
2.通过串口或者tcp等通信方式传给8266然后再写到flash 中。
3.直接转成C字符串嵌入到代码中
上述是我之前想到的,比较麻烦,看到了官方文档提供了一种更简单的方法。
这里我就直接贴官方说明了,稍微改了下例子,方便举一反三:
有时您的组件希望使用一个二进制文件或者文本文件,但是您又不希望将它重新格式化为 C 源文件。
这时,您可以在 component.mk 文件中设置变量 COMPONENT_EMBED_FILES,以这种方式指定要嵌入的文件的名称:
COMPONENT_EMBED_FILES := server_root_cert.der
或者,如果文件是字符串,则可以使用变量 COMPONENT_EMBED_TXTFILES,这将把文本文件的内容当成以 null 结尾的字符串嵌入:
COMPONENT_EMBED_TXTFILES := web_page/index.css
COMPONENT_EMBED_TXTFILES += web_page/index.html
文件的内容会被编译进 flash 中的 .rodata 段,并通过符号名称来访问,如下所示:
extern const uint8_t web_file_index_html_start[] asm("_binary_index_html_start");extern const uint8_t web_file_index_html_end[] asm("_binary_index_html_end");
符号名称是根据文件的全名生成的,如 COMPONENT_EMBED_FILES 中的所示,字符 / , . , 等都将会被下划线替代。符号名称中的 _binary 前缀由 objcopy 添加,对于文本和二进制文件都是相同的。
这样一看就能直接当数组引用了。
extern const uint8_t web_file_index_html_start[] asm("_binary_index_html_start");extern const uint8_t web_file_index_html_end[] asm("_binary_index_html_end")char *str =web_file_index_html_start;
unsignedint str_len =web_file_index_html_end-web_file_index_html_start; httpd_resp_send(req, str,str_len );
ESP32也一样~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~