嵌入式中如何将BootLoader与APP合并成一个固件

news2024/12/25 23:39:31

1、前言

嵌入式固件一般分为BootLoader和App,BootLoader用于启动校验、App升级、App版本回滚等功能,BootLoader在cpu上电第一阶段中运行,之后跳转至App地址执行应用程序。

因此,在发布固件的时候,会存在BootLoader固件和App固件;此时我们期望是将BootLoader固件和App固件合并成为一个固件,这样在量产时只需烧录一次即可。

图片

2、传统方式

一些传统的方法都是“土办法”,没什么毛病,但比较繁琐。

项目种类增加,或者版本发布频繁时更加体现出繁琐性,且易出错,操作稍微失误可能导致固件不完整;烧录不完整的固件,机子变“砖头”。

  • 烧录两次,分别烧录BootLoader和App固件

  • 烧录固件到芯片后,再从芯片读取固件,另存为hex文件

  • 手动复制、合并固件

  • BootLoader支持App固件传输功能的,只烧录BootLoader,后期再升级App

3、高效方式

我们目标是通过自动化脚本合并生成一个发布固件,提高效率和确保固件的完整性。

3.1 合并文件

Linux下的脚本我们用得很多,其实Windows的脚本也非常优秀,利用Windows的脚本可以快速实现增、删、查、改文件。常用Windows脚本命令如下。

  • 合并两个文件:copy /b

  • 重命名文件:ren <source_file> <dect_file>

  • 删除文件:del

很显然,我们利用其合并命令,只需一条指令即可将BootLoader和App文件合并。

例子:

假设当前目录存在Boot.bin和App.bin文件,合并后文件命名为Firmware.bin。

copy /b .\Boot.bin + .\App.bin Firmware.bin

注:Windows的目录路径为反斜杠,与Linux不同。

3.2 bin转hex

我们知道,二进制(bin)文件是不存在地址信息的,cpu上电执行并不一定是从地址0开始执行代码,如STM32芯片起始执行地址为0x8000000。

因此不能通过串口工具烧录bin文件,只能通过J-link或者ST-link烧录,并且在烧录前指定存储起始地址。因此,将bin文件转换为hex文件是有必要的。

bin转hex方式:

  • 使用jflash工具,把合并后的bin文件,使用jflash打开,另存为hex格式文件

  • 将bin文件烧录置芯片,读取出来,另存为hex文件

  • 自己动手写一个bin转hex工具

  • 借助第三方bin转hex工具

前两者太繁琐,效率低下;第三个比较灵活,但需要花点时间;如果使用优秀的现成工具是最快捷的办法。推荐使用“srec_cat.exe”工具,可以结合Windows脚本一起使用。

3.2.1 srec_cat工具

srec_cat一个功能非常强大的文件合并、转换工具,支持功能众多,包括:

  • 文件合并

  • 文件分割

  • bin转hex

  • hex转bin

  • 数据填充

  • CRC校验

此外,还存在srec的系列工具,文件比较工具 srec_cmp.exe和文件信息查看工具 srec_info.exe,可以从文章后面官方网站下载使用。

文件合并

命令格式:

srec_cat.exe <源文件0> <文件类型> <源文件1> <文件类型> <目标文件> <文件类型>

例子:

srec_cat.exe source0.bin -Binary source1.bin -Binary -o merge.bin -Binary
srec_cat.exe source0.hex -Intel source1.hex -Intel -o merge.hex -Intel

如果BootLoader和App生产的文件为hex格式,可以直接使用该命令合并为一个hex文件,注意地址的连续性。

bin转hex

命令格式:srec_cat.exe <bin源文件> <-Binary> <-offset> <偏移地址> <-Output> <hex目标文件> <-Intel>

例子:

将Boot.bin和App.bin合并的Firmware.bin转换为hex格式文件。

srec_cat.exe Firmware.bin -Binary -offset 0x8000000 -o Firmware.hex -Intel

0x8000000,是STM32的起始执行地址

更多的srec应用和工具下载详见官方网站:http://srecord.sourceforge.net/download.html

3.3 完整示例

第一步,在需要生成固件目录新建一个txt文件 第二步,键入如下内容(Boot固件和App固件可以指定目录)

copy /b .\Boot.bin + .\App.bin Firmware.bin
srec_cat.exe Firmware.bin -Binary -offset 0x8000000 -o Firmware.hex -Intel
del Firmware.bin

第三步,重命名txt文件为".bat"后缀文件,即是Windows可执行脚本的文件类型 第四步,双击运行脚本,即可生成目标文件 出现任何目标文件生成失败的情况,检查相关源文件是否存在,路径是否正确。

3.4 举一反三

以此类比,存在多个App文件的情况,可以通过该方式分别进行合并出一个固件。

另外,实际项目中,经常会使用内部flash空闲扇区保存一些设备参数信息,如校准系数、设备地址、序列号等信息,我们可以将参数信息保存为一个bin文件,通过该方式和固件合并,这样量产时将参数和固件一并写入,提高生产效率!

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1174202.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis02-持久化策略

目录 RDB&#xff08;Redis DataBase Backup file&#xff09; RDB执行原理 AOF&#xff08;Append-Only File&#xff09; RDB和AOF对比 Redis支持多种持久化方式&#xff0c;以确保数据在内存中持久存储&#xff0c;以便在Redis服务器重启时数据不会丢失。Redis中持久化的…

高效实用:批量重命名文件夹,提升工作效率

在日常生活和工作中&#xff0c;我们经常需要处理大量的文件夹&#xff0c;而文件夹的命名则直接关系到我们的管理效率和查找效率。如何快速、准确地批量重命名文件夹&#xff0c;提升工作效率呢&#xff1f;本文将提供一些实用的方法和技巧。现在一起来看看云炫文件管理器是如…

【Java 进阶篇】Java Cookie共享:让数据穿越不同应用的时空隧道

在Web开发中&#xff0c;Cookie是一种常见的会话管理技术&#xff0c;用于存储和传递用户相关的信息。通常&#xff0c;每个Web应用都会在用户的浏览器中设置自己的Cookie&#xff0c;以便在用户与应用之间保持状态。然而&#xff0c;有时我们需要在不同的应用之间共享Cookie数…

2.2整式的加减(第1课时)——合并同类项教学及作业设计

【学习目标】 1&#xff0e;理解同类项的概念&#xff0c;并能正确辨别同类项&#xff0e; 2&#xff0e;理解合并同类项的依据是乘法分配律&#xff0c;掌握合并同类项的方法&#xff0e; 知识点归纳&#xff1a; ★合并同类项后&#xff0c;所得的项的系数是___________…

Solidity数据类型之函数类型

solidity中函数的形式 function <function name>(<parameter types>) {internal|external|public|private} [pure|view|payable] [returns (<return types>)]每个关键字的意思&#xff08;方括号里面的写不写都可以&#xff09; function&#xff1a; 声明函…

基础知识:位运算

基础知识&#xff1a;位运算 1. 两类表达式 1. 两类表达式

【网安AIGC专题11.1】论文12:理解和解释代码,GPT-3大型语言模型学生创建的代码解释比较+错误代码的解释(是否可以发现并改正)

Comparing Code Explanations Created by Students and Large Language Models 写在最前面总结思考 背景介绍编程教育—代码理解和解释技能培养编程教育—解决方案研究问题研究结果 相关工作Code ComprehensionPedagogical Benifis of code explanationLarge Language Models i…

【监控指标】监控系统-prometheus、grafana。容器化部署。go语言 gin框架、gRPC框架的集成

文章目录 一、监控有哪些指标二、prometheus、grafana架构Prometheus 组件Grafana 组件架构优点 三、安装prometheus和node-exporter1. docker pull镜像2. 启动node-exporter3. 启动prometheus 四、promql基本语法五、grafana的安装和使用1. 新建空文件夹grafana-storage&#…

二维空间与三维空间的姿态表示法

二维空间与三维空间的姿态表示法 一、2D空间姿态表示法二、3D空间姿态表示法2.1 三个数表示空间姿态问题 2.2 九个数表示空间姿态问题 2.3 四个数表示空间姿态 结语Reference 假设&#xff0c;你有志成为我空军某航空旅歼-20飞行员&#xff0c;但要想开好飞机&#xff0c;那就得…

mac装不了python3.7.6

今天发现一个很奇怪的问题 但是我一换成 conda create -n DCA python3.8.12就是成功的 这个就很奇怪

数据结构——B树

文章目录 B树1. 概念2. B树插入分析3.插入过程4. B树插入实现5.B树验证6. B树性能分析7.B树&B*树8. 小结9. B树的运用MyISAMInnoDB 10. 总结 B树 可以用于查询的数据结构非常的多&#xff0c;比如说二插搜索树、平衡树、哈希表、位图、布隆过滤器&#xff0c;但如果需要存…

【MySQL】MySQL入门基础

文章目录 一、数据库基础1. 什么是数据库2. 数据库和文件3. 主流数据库&#xff08;关系型数据库&#xff09; 二、MySQL的基本使用1. 连接服务器2. 服务器管理3. 服务器、数据库、表关系4. 使用案例 三、数据的逻辑存储和实际存储四、MySQL的架构五、SQL分类六、存储引擎 一、…

Java基础-015-System.java常用类

Java基础-015-System.java常用类 1、标准输入输出2、获取属性3、System.java初始化4、设置标准输出System.out java/lang/System.java 1、标准输入输出 System.in、System.out public class Test {public static void main(String[] args) {String charsetName String.valueOf…

青少年python大赛知识点学习5--字典

python中的字典&#xff0c;与我们使用的新华字典有点像。索引与对象&#xff0c;新华字典存的是每个字的相关内容&#xff0c;python中的字典是一个容器类型的数据结构&#xff0c;通过key进行索引。 1.什么是字典 字典是python内置的重要数据之一&#xff0c;与列表一样是一…

Intel oneAPI笔记(2)--jupyter官方文档(oneAPI_Intro)学习笔记

前言 本文是对jupyterlab中oneAPI_Essentials/01_oneAPI_Intro文档的学习记录&#xff0c;包含对SYCL、DPC extends SYCL、oneAPI Programming models等介绍和SYCL代码的初步演示等内容 oneAPI编程模型综述 oneAPI编程模型提供了一个全面而统一的开发人员工具组合&#xff0…

Go与数据库:NoSQL数据库的应用

大家好&#xff01;我是[lincyang]。 今天我们将一起探索Go语言与NoSQL数据库结合的强大能力&#xff0c;并通过五个实际案例来深入理解它们的应用。 1. Go与MongoDB的结合 1.1 用户管理系统 在用户管理系统中&#xff0c;我们需要存储用户的基本信息和权限设置。MongoDB的…

MQTT协议零基础快速入门

MQTT协议零基础快速入门 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的发布/订阅消息传输协议&#xff0c;广泛应用于物联网&#xff08;IoT&#xff09;和机器对机器&#xff08;M2M&#xff09;通信场景。它具有简单、开放、易于实现等优…

产品经理入门学习(五):思维导图 原型设计

参考引用 黑马-产品经理入门基础课程 1. 思维导图的作用和应用场景 什么是思维导图&#xff1f; 思维导图是一种将思维进行可视化的实用工具。具体实现方法是用一个关键词去引发相关想法&#xff0c;再运用图文并茂的技巧把各级主题的关系用相互隶属的层级表现出来&#xff0c;…

多态 虚函数表深度剖析 纯干货讲解(2)

&#x1f4af; 博客内容&#xff1a;多态 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准C后端工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&#xff01; &#x1f496; 欢迎大家&#xff1a;这里是CSD…

crond服务

目录 一、crond服务基础知识 1、crond服务介绍 2、查看crond服务的状态 3、crond服务配置文件详解 4、额外的配置文件目录 二、crond服务基础命令 1、crond服务使用 2、 管理和操作 crond 服务 3、crond服务命令举例 一、crond服务基础知识 1、crond服务介绍 1、crond…