本文章 来自原创专栏《ESP32教学专栏 (基于ESP-IDF)》,讲解如何使用 ESP-IDF 构建 ESP32 程序,发布文章并会持续为已发布文章添加新内容! 每篇文章都经过了精打细磨!
↓↓↓通过下方对话框进入专栏目录页↓↓↓
CSDN 请求进入目录 _ O x
是否进入ESP32教学导航(基于ESP-IDF)?
确定
有时候,我们需要很大的二进制数据或文本数据。你可能很快想到手搓或者生成一个C头文件来使用。
但是,有时候格式化一个头文件并不方便,这就需要一种更加方便的方式来嵌入二进制或文本数据到工程或组件中。
嵌入二进制或文本数据的方案有两种,一种是在组件中,另一种是在工程中。
在组件中嵌入二进制文件或文本数据十分简单。只需要调用idf_component_register
时加入EMBED_FILES
或EMBED_TXTFILES
参数即可。
区别如下:
EMBED_TXTFILES
表示嵌入文件时,末尾自动补全一个'\0'
表示字符串的结束。【下文以此为例】EMBED_FILES
则会原封不动地嵌入原始数据。例如我们把test.html
放入组件文件夹,打算以文本形式嵌入,然后在EMBED_TXTFILES
中填入这个文件即可。
.
├─ CMakeLists.txt
└─ main
├─ CMakeLists.txt
├─ test.html
└─ main.c
# `main/CMakeLists.txt` 文件:
idf_component_register(
SRCS "main.c"
INCLUDE_DIRS "."
EMBED_TXTFILES "test.html"
)
EMBED_TXTFILES
可以传多个文件,如:EMBED_TXTFILES "test.html" "lost_rivers.mp3" ...
这样文件就会被构建系统放入组件了,那么我们怎么在C中访问这个文件内容呢?
很简单,只需要在组件的任意位置写下如下两句:
全局变量和局部变量都行
extern const uint8_t test_html_start[] asm("_binary_test_html_start");
extern const uint8_t test_html_end[] asm("_binary_test_html_end");
这两个变量分别代表了嵌入的二进制文件的头指针和尾指针。
请读者先看下边的例程,这个规则稍后讲解
假如我们为test.html
添加如下内容:
然后使用上边的方法编写这两个变量,然后用printf
打印一下。
两个变量可以随意命名,但是asm()
中的东西不能随便命名,它们有如下规则:
把上边CMake
文件中的文件名中的 /
、.
等字符用下划线代替,得到新文件名,然后
_binary_
+ 新命名 + _start
_binary_
+ 新命名 + _end
再比如:lost_rivers.mp3
,则应写成:
extern const uint8_t test_html_start[] asm("_binary_lost_rivers_mp3_start");
extern const uint8_t test_html_end[] asm("_binary_lost_rivers_mp3_end");
与在组件中不同,在工程中嵌入二进制数据需要在顶层CMakeLists.txt
中添加如下语句:(需要在project()
之后)
target_add_binary_data(
${PROJECT_NAME}.elf "main/data.html" TEXT
)
同样,最后一个参数若是 TEXT
,那么构建系统会嵌入以 '\0'
结尾的字符串,如果最后一个参数被设置为 BINARY
,则将文件内容按照原样嵌入。
引用方法一样:_binary_main_data_html_start
extern const uint8_t main_data_start[] asm("_binary_main_data_html_start")
extern const uint8_t main_data_end[] asm("_binary_main_data_html_end")
用法请看上一个实例