• ESP32 之 ESP-IDF 教学(十九)—— 在工程或组件中嵌入二进制数据


    本文章 来自原创专栏《ESP32教学专栏 (基于ESP-IDF)》,讲解如何使用 ESP-IDF 构建 ESP32 程序,发布文章并会持续为已发布文章添加新内容! 每篇文章都经过了精打细磨!

    ↓↓↓通过下方对话框进入专栏目录页↓↓↓
    CSDN 请求进入目录       _ O x

    是否进入ESP32教学导航(基于ESP-IDF)?

           确定


    一、嵌入二进制数据简介

    有时候,我们需要很大的二进制数据或文本数据。你可能很快想到手搓或者生成一个C头文件来使用。

    但是,有时候格式化一个头文件并不方便,这就需要一种更加方便的方式来嵌入二进制或文本数据到工程或组件中。

    嵌入二进制或文本数据的方案有两种,一种是在组件中,另一种是在工程中

    二、在组件中嵌入二进制数据

    在组件中嵌入二进制文件或文本数据十分简单。只需要调用idf_component_register时加入EMBED_FILESEMBED_TXTFILES参数即可。

    区别如下:

    • EMBED_TXTFILES表示嵌入文件时,末尾自动补全一个'\0'表示字符串的结束。【下文以此为例】
    • EMBED_FILES 则会原封不动地嵌入原始数据。

    例如我们把test.html放入组件文件夹,打算以文本形式嵌入,然后在EMBED_TXTFILES中填入这个文件即可。

    1、示例

    .
    ├─ CMakeLists.txt
    └─ main
        ├─ CMakeLists.txt
        ├─ test.html
        └─ main.c
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    # `main/CMakeLists.txt` 文件:
    idf_component_register(
        SRCS            "main.c"
        INCLUDE_DIRS    "."
        EMBED_TXTFILES  "test.html"
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    EMBED_TXTFILES可以传多个文件,如:

    EMBED_TXTFILES    "test.html"   "lost_rivers.mp3"   ...
    
    • 1

    这样文件就会被构建系统放入组件了,那么我们怎么在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");
    
    • 1
    • 2

    这两个变量分别代表了嵌入的二进制文件的头指针和尾指针。

    请读者先看下边的例程,这个规则稍后讲解

    假如我们为test.html添加如下内容:
    在这里插入图片描述
    然后使用上边的方法编写这两个变量,然后用printf打印一下。
    在这里插入图片描述

    2、规则

    两个变量可以随意命名,但是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");
    
    • 1
    • 2

    三、在项目工程中嵌入二进制数据

    与在组件中不同,在工程中嵌入二进制数据需要在顶层CMakeLists.txt中添加如下语句:(需要在project()之后)

    target_add_binary_data(
    	${PROJECT_NAME}.elf   "main/data.html"   TEXT
    )
    
    • 1
    • 2
    • 3

    同样,最后一个参数若是 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")
    
    • 1
    • 2
    • 3

    用法请看上一个实例

  • 相关阅读:
    嵌入式学习的第二天
    数据结构习题(单链表)
    webpack5+vue3搭建一个基础的h5项目结构
    双写绕过 [极客大挑战 2019]BabySQL 1
    如何安装Wnmp并结合内网穿透实现外网访问内网Wnmp服务
    驾驶数字未来:汽车业界数字孪生技术的崭新前景
    Auto.js Pro 编写第一个脚本hello world
    设计模式-原型模式-浅克隆和深克隆在Java中的使用示例
    Java EE -- Spring
    艾美捷EndoGrade卵清蛋白注意事项说明
  • 原文地址:https://blog.csdn.net/m0_50064262/article/details/126567008