当前位置: 首页 > news >正文

ESP32嵌入固件读取

虽然我们引入了littlefs,但是在实际使用中用littlefs并不是很方便,因为HTML网页存在了文件系统中,在读取时依旧需要占用一个新的缓存来加载它,这就造成了网页被保存了两次。

更好的做法是利用ESP-idf原生的二进制数据嵌入特性,直接将文件嵌入到固件中。

ESP-IDF提供了 target_add_binary_data()的CMake函数,这是一个专门用于将任意文件嵌入到固件中的工具。我们在CMakeLists.txt文件中将文件打包成目标文件(.obj),之后生成全局符号标记数据的起始和结束位置,然后在链接阶段将这些数据嵌入到最终的固件二进制文件中。

具体做法是,我们在littlefs文件目录中的CMakeLists.txt文件中插入:

# 嵌入HTML文件
target_add_binary_data(${COMPONENT_LIB}  "web/index.html" TEXT)

ESP-IDF工具链遵循固定的命名模式生成对应文件的起始和结束位置:

  • 起始符号 : _binary_<文件名>_start
  • 结束符号 : _binary_<文件名>_end

例如,对于index.html就变成了_binary_index_html_start_binary_index_html_end
使用

extern const uint8_t index_html_start[] asm("_binary_index_html_start");
extern const uint8_t index_html_end[]   asm("_binary_index_html_end");

获取这两个位置。

然后就可以使用算术指针计算该数据块大小:

*size = index_html_end - index_html_start;

我们新定义一个get_embedded_index_html函数

const uint8_t* get_embedded_index_html(size_t* size)
{if (size) {*size = index_html_end - index_html_start;}return index_html_start;
}

这个函数确保HTML文件已经正确的放进了固件中(因为size存在才不报错,而size存在就说明有这么个文件),并返回指向这个文件的指针。

这样,我们在主程序中就可以直接调用这个get_embedded_index_html,也就直接获得了固件中的HTML文件数据,省去了再次缓存的麻烦。

HTML文件被存放进了flash当中,后续也可以使用OTA功能实现网页更新升级。


文章转载自:

http://ZgOP9emj.tbqxh.cn
http://u3aDTkVt.tbqxh.cn
http://TDSHwIy9.tbqxh.cn
http://KZCww7yz.tbqxh.cn
http://kPb007im.tbqxh.cn
http://kzP3lGzW.tbqxh.cn
http://0IplisaN.tbqxh.cn
http://mqPh6XYe.tbqxh.cn
http://zBVSaRN2.tbqxh.cn
http://F0p9sE9d.tbqxh.cn
http://dmf8QFpU.tbqxh.cn
http://u8RKm7Xv.tbqxh.cn
http://1erv8WW9.tbqxh.cn
http://EPtIvB6g.tbqxh.cn
http://kvCzfV7X.tbqxh.cn
http://s9K0Bnlz.tbqxh.cn
http://FxuKDUCt.tbqxh.cn
http://5ApiPXr7.tbqxh.cn
http://1PMoQp2Y.tbqxh.cn
http://GSRZS3fr.tbqxh.cn
http://Y1lwca7Q.tbqxh.cn
http://XWNgchW8.tbqxh.cn
http://gDRQhCbq.tbqxh.cn
http://77dqeXD0.tbqxh.cn
http://6URuujeV.tbqxh.cn
http://kdfshnuI.tbqxh.cn
http://aKD8ZJUX.tbqxh.cn
http://79YX92jT.tbqxh.cn
http://rVBERrnb.tbqxh.cn
http://0k6AFb0h.tbqxh.cn
http://www.dtcms.com/a/364840.html

相关文章:

  • AI大模型对决:谁是最强智能?
  • MySQL 8.0.40 主从复制完整实验总结(基础搭建 + 进阶延时同步与误操作恢复)
  • [信号与系统个人笔记]第三章 连续时间信号与系统的频域分析 Part 2
  • flutter 中间组件自适应宽度
  • 从在线工具到代码库:图表设计工具挑选指南
  • uniapp 开发上架 iOS App全流程
  • Spring Boot 事务失效的八大原因及解决方案详解
  • iOS 上架 uni-app 流程全解析,从打包到发布的完整实践
  • Hostol Magento电商服务器套餐:基于阿里云,预配置高性能环境,一键开店
  • CouponHub项目开发记录-基于责任链来进行创建优惠券模板的参数验证
  • Vue+Echarts饼图深度美化指南:打造卓越数据可视化体验
  • 【串口助手】串口调试助手LTSerialTool v3.12.0发布
  • 打靶日记-SQLi-LABS(二)
  • LeetCode 3132.找出与数组相加的整数2
  • 金融行业数智化转型:如何用企业微信AI实现高效内部协作与外部服务?
  • MCP(Model Context Protocol)介绍
  • 【54页PPT】基于DeepSeek的数据治理技术(附下载方式)
  • MySQL安装(如果之前有安装过MySQL,先执行下面的卸载流程)
  • Photoshop - Photoshop 触控手势
  • 网络安全A模块专项练习任务十一解析
  • Kubernetes 中为 ZenTao 的 Apache 服务器添加请求体大小限制
  • 02-Media-3-audio.py 音频输入输出,录音、播放、实时回放演示
  • nestjs 阿里云服务端签名
  • Spring boot3.x整合mybatis-plus踩坑记录
  • Ansible 核心配置与任务管理:主机清单、剧本,任务的导入、配置并行
  • Jenkins-Ansible部署discuz论坛
  • 如何利用SMS、RDS把服务从阿里云迁移到华为云
  • 嵌入式高薪岗位有哪些?
  • 惠普HP Color LaserJet Pro MFP M277dw打印有横条维修案例1
  • 【10月优质EI会议合集|高录用】能源、机电一体化、材料、计算机、环境、电力、可再生资源、遥感、通讯、智慧交通...