【嵌入式烧录/刷写文件】-1.2-合并两个Motorola S-record(S19/SREC/mot/SX)文件

本文详细介绍了如何将Bootloader.s19和App.s19文件合并成一个S19文件,以简化嵌入式软件的刷写过程。通过VectorHexView工具的自动和手动方法,结合批处理脚本,可以高效地完成两个S19文件的合并,并提供了具体的操作步骤和参数设置。此外,文章还讨论了地址范围的确定和特定字符的填充技术。

案例背景(共8页精讲):
1.教你如何合并两个Bootloader.s19App.s19文件;
2.提供了两种方法合并两个Motorola S-record(S19/SREC/mot/SX)文件;
3.基于批处理Bat脚本,以及Vector HexView工具提供的Command line自动化完成两个S19文件的合并(介绍批处理在嵌入式软件开发过程中的典型应用);

目录

1 为什么要将Bootloader.s19和App.s19合并成一个s19文件?

1.1 Bootloader和Application地址范围说明

2 使用Vector HexView工具合并两个S19文件

2.1 “自动合并”两个S19文件

2.1.1 对两个S19文件特定地址范围进行合并

2.1.2 特定字符的自动填充

2.1.3 Command line命令行说明

2.2 “手动合并”两个S19文件

2.2.1特定字符的手动填充

结尾


优质博文推荐阅读(单击下方链接,即可跳转):

点击返回「《Autosar从入门到精通-实战篇》总目录」

点击返回「《Autosar_BSW高阶配置》总目录」

点击返回《嵌入式硬件/软件开发刷写/烧录文件》专栏

1 为什么要将Bootloader.s19和App.s19合并成一个s19文件?

我们经常需要将Bootloader程序Application应用程序合并到同一个S19文件中,这样可以简化整个软件/固件的刷写/升级过程

Bootloader是一个特殊的程序,其主要功能是用来引导应用程序的运行。在实际的应用中,我们经常需要对应用程序进行刷写/升级,而刷写/升级过程需要将新的应用程序下载到设备中。如果应用程序Bootloader分别存储在不同的文件中,那么在刷写/升级过程中就需要分别下载这两个文件,并且还需要确保这两个文件的版本是兼容的,否则可能会导致设备无法正常工作。

因此,将Bootloader应用程序合并到同一个文件中可以简化软件/固件刷写/升级的过程,减少用户的操作复杂度。在刷写/升级过程中,我们只需要下载一个文件,就可以完成整个软件/固件的刷写/升级。另外,在合并的过程中,我们可以使用一些特殊的技术,比如加密、校验和等,来保证软件/固件的安全性和完整性。

1.1 Bootloader和Application地址范围说明

当将Bootloader应用程序合并到同一个文件时,需要确定它们在文件中的地址范围。一般来说,Bootloader和应用程序需要存储在不同的地址范围内,以便在固件启动时正确加载它们。

下面是一个示例,假设Flash的总大小为256KB,其中Bootloader的大小为32KB,应用程序的大小为192KB,保留32KB用于其它数据。

Other Data

Application

Boootloaer

  • Bootloader的地址范围:0x00000000 - 0x00007FFF

在Flash中,Bootloader一般存储在起始地址处,通常是0x00000000开始的连续地址范围。在本示例中,它占用的地址范围是0x00000000 - 0x00007FFF,Bootloader的大小为32KB。

  • 应用程序的地址范围:0x00008000 - 0x0003FFFF

在Flash中,应用程序一般存储在Bootloader之后的地址范围内,通常是0x00008000开始的连续地址范围。在本示例中,它占用的地址范围是0x00008000 - 0x0003FFFF,应用程序的大小为192KB。

  • 其它数据的地址范围:0x00040000 - 0x0007FFFF

在Flash中,我们通常会保留一部分地址范围用于存储其它数据,比如配置信息、用户数据等等。在本示例中,我们保留了32KB的地址范围,用于存储其它数据。

正确的确定Bootloader和应用程序的地址范围是软件/固件设计中非常重要的一部分,它不仅关系到固件的安全性和可靠性,还关系到固件的性能和扩展性。

2 使用Vector HexView工具合并两个S19文件

工具版本Vector HexView V1.12.05 ,见图2-1.

图2-1

参考文档ReferenceManual_HexView.pdf

合并的S19文件之一:Bootloader.s19摘录

S0110000486578766965772056312E30352EA6
S123900058595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576775C
S123902078797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90919293949596973C
S123904098999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B71C
S1239060B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7FC
S1239080D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7DC
S12390A0F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F1011121314151617BC
S12390C018191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233343536379C
S10C90E038393A3B3C3D3E3F4067
S9030000FC

合并的S19文件之一:Application.s19摘录

S0110000486578766965772056312E30352EA6
S123910058595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576775B
S123912078797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90919293949596973B
S123914098999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B71B
S1239160B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7FB
S1239180D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7DB
S12391A0F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F1011121314151617BB
S12391C018191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233343536379B
S10B91E038393A3B3C3D3E3FA7
S9030000FC

2.1 “自动合并”两个S19文件

如果你想成为制作批处理Bat脚本的高手,可研究专栏《批处理BAT从入门到精通》总目录_培训教程持续更新中...https://blog.youkuaiyun.com/qfmzhu/article/details/128812985

基于批处理Bat(如下图中的Merging_Two_S19_File.bat)调用HexView工具提供的Command line,通过该脚本来实现两个S19文件(Bootloader.s19和Application.s19)的合并。将该该脚本集成开发环境IDECodeWarriorS32K DSDavinciEB TresosETAS…)中,即可自动实现S19文件的合并。见图2-2。

图2-2

Merging_Two_S19_File.bat摘录:

@echo off

Rem Path to the executable exe of the Vector HexView tool on your PC
set "HexViewPath=D:\Merge\HexView\hexview.exe"

Rem Input_S19_File1 indicates one of the merged source files and its path
set "Input_S19_File1=D:\Merge\Bootloader.s19"

Rem Input_S19_File2 indicates one of the merged source files and its path
set "Input_S19_File2=D:\Merge\Application.s19"

Rem Output_S19_File indicates the output S19 file, and its path, after the merge
set "Output_S19_File=D:\Merge\Boot+App.s19"

Rem Call the command line provided by the HexView tool and merge Input_S19_File1 and Input_S19_File2 to output a new Output_S19_File
%HexViewPath% /S /MT:%Input_S19_File1%+%Input_S19_File2% /XS:32 -o %Output_S19_File%

 运行该批处理Merging_Two_S19_File.bat,即可得到合并后的Boot+App.s19文件

S123900058595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576775C
S123902078797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90919293949596973C
S123904098999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B71C
S1239060B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7FC
S1239080D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7DC
S12390A0F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F1011121314151617BC
S12390C018191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233343536379C
S10C90E038393A3B3C3D3E3F4067
S123910058595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576775B
S123912078797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90919293949596973B
S123914098999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B71B
S1239160B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7FB
S1239180D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7DB
S12391A0F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F1011121314151617BB
S12391C018191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233343536379B
S10B91E038393A3B3C3D3E3FA7
S9030000FC

2.1.1 对两个S19文件特定地址范围进行合并

如何你想对两个S19文件特定地址范围进行合并,可将批处理Merging_Two_S19_File.bat最后一段改写如下,也能实现上述效果。

%HexViewPath% /S /MT:%Input_S19_File1%;0x0:0x9000-0x90E8+%Input_S19_File2%;0x0:0x9100-0x91E7 /XS:32 -o %Output_S19_File%

此法适用于Vector HexView V1.7及以上版本对于V1.12.05版本,可以省略/MT中的Offset

2.1.2 特定字符的自动填充

如何你想对合并后的S19文件进行自动填充,可在批处理Merging_Two_S19_File.bat最后追加一段:

Rem For a new Output_S19_File, fill in the characters

%HexViewPath% %Output_S19_File% /S /FA: /AF:0xFF /XS:32 -o %Output_S19_File%

运行该批处理Merging_Two_S19_File.bat,对比修改前后两个Boot+App.s19文件的差异,见图2-3。

图2-3

2.1.3 Command line命令行说明

/S :该选项用于抑制对GUI的任何输出,在无声模式下运行HexView。。在执行了命令行选项中给出的所有命令后,HexView将被关闭。

/MT:file1[;offset][:range1][+file2][;offset][:range1] :一个或多个文件以透明模式合并到memory中(现有数据不被覆盖)。可选的offset将应用于被合并的文件的所有地址。

/XS[:reclinelen[:rectype]]:以Motorola S-Record格式导出。Reclinelen表示Data段的长度。

/FA :创建一个单一的区域文件(填写所有)。这个选项可以用来创建一个单块文件。在这种情况下,HexView将使用第一个区块的起始地址和最后一个区块的结束地址。

/Af:xx: : 指定填充字符,但xx可以指定为十进制(无后缀)、十六进制值(0x-后缀)或二进制(b-后缀)。

2.2 “手动合并”两个S19文件

HexView工具打开Bootloader.s19文件,见图2-4。

图2-4

接着在菜单栏中依此选择File – >Merge,见图2-5。

图2-5

在弹出的Select file for merge operation对话框中,选择Application.s19文件,接着单击打开,见图2-6。

图2-6

紧接着在弹出的Merge data file to current document对话框中,选择Application.s19文件中需要合并的地址范围(如果你是所有的地址范围都合并,通常默认,无需改动),接着单击Ok,见图2-7。

图2-7

两个S19文件合并后的效果,见图2-8。

图2-8

Save as另存该文件,并给合并后的S19文件命名Boot+App.s19。至此完成了“手动合并”两个S19文件,见图2-9。

图2-9

2.2.1特定字符的手动填充

接着在菜单栏中依此选择Edit – > Fill block data,,见图2-10。

图2-10

在弹出的Fill block data对话框中,单击Get “Fill all region”,得到需要填充的地址范围,接着在Fill with a record中填写填充值,见图2-11。

图2-11

至此完成特定字符的手动填充,保存该S19文件即可,见图2-12。

图2-12

结尾

获取更多“汽车电子资讯”和“工具链使用”,

请关注优快云博客“汽车电子助手”,做您的好助手。

### 三级标题:BootLoader 的定义与作用 BootLoader嵌入式系统中一种特殊的程序,负责在系统启动时加载主应用程序。它通常存储在非易失性存储器(如 Flash)中,主要任务包括初始化硬件、设置运行环境,并最终跳转到应用程序的入口点执行。在固件升级场景中,BootLoader 还承担了通过特定通信接口(如 USB、CAN、UART 等)接收新版本固件并写入存储器的功能 [^1]。 ### 三级标题:BootLoader 的工作原理 BootLoader 的运行分为多个阶段。第一阶段通常进行最基本的硬件初始化,如时钟、内存控制器等,确保系统能够运行。第二阶段则负责更复杂的初始化工作,如配置通信接口、验证固件完整性,并根据升级标志决定是否进入升级模式或直接跳转到应用程序。跳转过程中,BootLoader 必须清理自身占用的中断、寄存器等资源,否则可能导致应用程序运行异常 [^1]。 ### 三级标题:BootLoader 的常见问题及解决方案 #### 问题1BootLoader 在跳转到应用程序前未清理自身痕迹 BootLoader 若未正确关闭中断、释放内存或重置外设寄存器,可能导致应用程序运行异常。解决方法是确保在跳转前执行完整的清理操作,包括关闭全局中断、复位外设、清除中断标志等 。 #### 问题2:需要应用程序传递信息给 BootLoader 在某些升级策略中,应用程序需要通知 BootLoader 进入升级模式。可以通过共享内存、特定 Flash 区域或看门狗机制实现。例如,在应用程序中设置一个标志位,BootLoader 在启动时读取该标志,决定是否进入升级流程 [^1]。 #### 问题3:应用程序单独运行正常,通过 BootLoader 跳转后死机 这通常是因为 BootLoader 和应用程序使用了不同的堆栈或内存布局。解决方法包括统一堆栈配置、确保跳转前关闭 BootLoader 使用的中断、正确设置向量表偏移等。此外,应用程序入口点应为标准的 main 函数地址,而非 Reset_Handler [^1]。 #### 问题4:固件升级过程中频繁中断 升级过程中可能因通信不稳定或数据校验失败导致中断。解决方法包括优化通信协议、增加重传机制、使用 CRC 校验确保数据完整性。此外,升级前应关闭全局中断,防止中断服务程序干扰升级流程 [^2]。 #### 问题5:上位机操作复杂,客户难以使用 简化上位机操作可通过图形化界面、自动化流程、一键升级等方式实现。例如,MicroBoot 提供了简洁的上位机工具,用户仅需选择固件文件并点击升级按钮即可完成操作 。 ### 三级标题:常见 BootLoader 项目及其特点 #### STM32-Bootloader 该项目为 STM32 微控制器提供了一个基础的 BootLoader 示例,支持通过 USB COM 接口进行固件更新,并能够跳转到两个不同的应用程序。其主要功能包括擦除 Flash、开始和结束固件更新等 [^2]。 #### PX4 Bootloader 专为 Pixhawk 系列飞行控制器设计,支持 PX4FMU、PX4IO 和 PX4FLOW 等设备。该项目基于 C 语言开发,包含少量 Shell、Makefile 和 Python 脚本,用于编译、烧录和调试 [^3]。 #### CAN-Bootloader 基于 USB2XXX 实现的 CAN 总线 Bootloader,适用于 STM32F1、STM32F2、STM32F4 等系列单片机。该项目通过 CAN 总线实现远程固件升级功能 [^4]。 #### TinyUF2 跨平台的 UF2 Bootloader 项目,适用于 ESP32S2、STM32F4 和 iMX RT10xx 等设备。基于 TinyUSB 开发,使用 C 语言编写,并包含 Makefile 脚本用于编译和烧录 [^5]。 ### 三级标题:BootLoader 移植与开发注意事项 在移植 BootLoader 到不同平台时,需注意以下几点: - **硬件初始化顺序**:确保 BootLoader 正确初始化时钟、Flash、通信接口等关键模块。 - **内存布局配置**:合理划分 BootLoader 和应用程序的 Flash 地址空间,避免冲突。 - **向量表偏移设置**:应用程序运行时需重新设置向量表偏移,使其指向正确的中断处理函数。 - **调试与日志输出**:添加调试信息输出功能,有助于快速定位升级失败或跳转异常问题。 ```c // 示例:跳转到应用程序的代码片段 typedef void (*pFunction)(void); pFunction Jump_To_Application; // 设置主堆栈指针 __set_MSP(*((uint32_t *)APP_ADDRESS)); // 设置跳转地址 Jump_To_Application = (pFunction)(*((uint32_t *)(APP_ADDRESS + 4))); // 跳转到应用程序 Jump_To_Application(); ``` ### 三级标题:总结 BootLoader嵌入式系统中实现固件升级的重要组件,其设计和实现需兼顾稳定性、兼容性和易用性。通过合理配置硬件、优化通信协议、确保跳转流程安全,可以有效解决升级失败、跳转异常等问题。同时,参考开源项目如 STM32-Bootloader、PX4 Bootloader、CAN-Bootloader 和 TinyUF2,有助于快速构建适用于不同平台的 BootLoader 系统 [^1][^3][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汽车电子助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值