場景:
在寫ESP8266 web服務的時候,免不了要將自己設計的網頁html和css等文件放入到固件中。在arduino中有fs可以進行上傳文件,然后通過文件系統讀出。那在ESP-IDF中該怎么辦呢。有幾個思路
1. 通過flash_download_tools 直接向固定地址寫入文件。然后在代碼中讀出來
2.通過串口或者tcp等通信方式傳給8266然后再寫到flash 中。
3.直接轉成C字符串嵌入到代碼中
上述是我之前想到的,比較麻煩,看到了官方文檔提供了一種更簡單的方法。
鏈接:https://docs.espressif.com/projects/esp-idf/zh_CN/v4.1-beta1/api-guides/build-system-legacy.html
這里我就直接貼官方說明了,稍微改了下例子,方便舉一反三:
有時您的組件希望使用一個二進制文件或者文本文件,但是您又不希望將它重新格式化為 C 源文件。
這時,您可以在 component.mk
文件中設置變量 COMPONENT_EMBED_FILES
,以這種方式指定要嵌入的文件的名稱:
COMPONENT_EMBED_FILES := server_root_cert.der
或者,如果文件是字符串,則可以使用變量 COMPONENT_EMBED_TXTFILES
,這將把文本文件的內容當成以 null 結尾的字符串嵌入:
文件的內容會被編譯進 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;
unsigned int str_len =web_file_index_html_end-web_file_index_html_start; httpd_resp_send(req, str,str_len );
ESP32也一樣~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~