S19文件合并
如今在汽车电子软件开发中常常涉及到在线升级,这样的应用中必将会使用Bootloader,一般Bootloader会独立于应用程序,如此则会生成独立的二进制文件。而应用程序也是一个独立的模块,同样也会生成独立的二进制文件。对于Freescale系列MCU则其对应的二进制文件为S19文件。
由于一个嵌入式产品中同时需要烧录两份独立的S19文件该如何实施呢,比较容易实现的便是先将Bootloader烧录至MCU中,然后用在线升级工具,在汽车电子应用中通常为诊断仪。显然,对批量生产来说这是不易被接受的。这就要求将Bootloader和应用程序同时烧录至MCU中,接下来我将介绍如何将两个独立的S19文件合并至一个S19文件中,并通过一次烧录将两个模块都烧录至MCU中。
鉴于我前面做过的两个项目中使用的都是S9S08DZ60 MCU,我将以其中的一个实例作为介绍。
在我的一个电动座椅控制器项目中有一个基于CAN总线的Bootloader,我将其代码分配在0xD600~0xFFAF空间内,而应用程序代码分配在0×1900~0xD5FF空间内,考虑到中断向量入口地址是固定,因此在Bootloader中尽量不用中断,从而避免两个模块中断入口的重叠问题。
前面所述皆为铺垫,现在切入主题吧。首先来开应用程序的S19文件(只截取部分作为说明)
S0450000453A5C44465C5331355C434F44455C5331355F445343555F56322E585C5331355F
445343555F56322E325F3131313032365C62696E5C5331355F445343552E616273A9
S12319008B899EFE05F6AF019EFF05888A81A7FCC6198D4C95E701C6198C4CF732198E20B4
S12319201F898BF687E6024C9EE706E603EE018A4C20037FAF014BFB9E6B05F78A88AF0424……
S1239A0020A47FB7203F213F22CD1DC88A80000E0100505050505050287FFF7FFF7FFF0119
S1059A20000040
S107FFC485238533D5
S107FFCA86D18BDC71
S107FFD08A488FDBED
S105FFDC884F48
S105FFE899E595
S107FFFC99C5198204
S9030000FC
这其中只包含S0,S1,S9三种类型的记录。根据S19文件格式详解中的介绍我们可以知道,S0只是包含一些对于MCU来说是无用的信息,标识记录的开始,S9也是与MCU代码无关的记录,标识记录的结束。S1才是我们真正需要烧录至MCU中的内容,因此我们需要注意这些记录,不要轻易的改变他们。
接下来看看Bootloader的S19文件(只截取部分作为说明)
S0420000453A5C44465C5331355C434F44455C426F6F746C6F616465725C533135426F6F744
C6F6164657228313131303131295C62696E5C50726F6A6563742E616273C3
S123D600451080943200FC655555260B3200FE6555552603CCD7D43217FE6555552703CC04
S123D620D7D4CDE424E60387E602879EAE898B9EFE07E6039EE711E6029EE7109EAE9EFF9F……
S123EBA0E601FAE703A606E796CDEAD2CDDD22A70281C607EFC10130261BC607F0C101313F
S11DEBC02613C607F1C10132260BC607F2C101332603A601814F81A601811E
S105FFFED60027
S9030000FC
同样这个S19文件中也只包含S0,S1,S9三种类型的记录。首先咱们复制一份应用程序的S19文件,以防不测。
复制Bootloader中如下部分,并粘贴到应用程序的S19文件中,具体如下
S0450000453A5C44465C5331355C434F44455C5331355F445343555F56322E585C5331355F
445343555F56322E325F3131313032365C62696E5C5331355F445343552E616273A9
S12319008B899EFE05F6AF019EFF05888A81A7FCC6198D4C95E701C6198C4CF732198E20B4
S12319201F898BF687E6024C9EE706E603EE018A4C20037FAF014BFB9E6B05F78A88AF0424……
S1239A0020A47FB7203F213F22CD1DC88A80000E0100505050505050287FFF7FFF7FFF0119
S1059A20000040
S123D600451080943200FC655555260B3200FE6555552603CCD7D43217FE6555552703CC04
S123D620D7D4CDE424E60387E602879EAE898B9EFE07E6039EE711E6029EE7109EAE9EFF9F……
S123EBA0E601FAE703A606E796CDEAD2CDDD22A70281C607EFC10130261BC607F0C101313F
S11DEBC02613C607F1C10132260BC607F2C101332603A601814F81A601811E
S107FFC485238533D5
S107FFCA86D18BDC71
S107FFD08A488FDBED
S105FFDC884F48
S105FFE899E595
S107FFFC99C5198204
S9030000FC
接下来咱们考虑的重点就是复位向量的跳转地址问题了,显然两模块的复位向量是重叠,一般我们使用的是Bootloader的复位向量跳转地址,也就是说程序启动首先执行Bootloader的代码,然后在Bootloader中跳转至应用程序中。这样咱们还得对代码做如下修改。
S0450000453A5C44465C5331355C434F44455C5331355F445343555F56322E585C5331355F
445343555F56322E325F3131313032365C62696E5C5331355F445343552E616273A9
S12319008B899EFE05F6AF019EFF05888A81A7FCC6198D4C95E701C6198C4CF732198E20B4
S12319201F898BF687E6024C9EE706E603EE018A4C20037FAF014BFB9E6B05F78A88AF0424……
S1239A0020A47FB7203F213F22CD1DC88A80000E0100505050505050287FFF7FFF7FFF0119
S1059A20000040
S123D600451080943200FC655555260B3200FE6555552603CCD7D43217FE6555552703CC04
S123D620D7D4CDE424E60387E602879EAE898B9EFE07E6039EE711E6029EE7109EAE9EFF9F……
S123EBA0E601FAE703A606E796CDEAD2CDDD22A70281C607EFC10130261BC607F0C101313F
S11DEBC02613C607F1C10132260BC607F2C101332603A601814F81A601811E
S107FFC485238533D5
S107FFCA86D18BDC71
S107FFD08A488FDBED
S105FFDC884F48
S105FFE899E595
S107FFFC99C5D600C9
S9030000FC
主要红色部分,咱们已经修改了地址重叠的部分即1982->D600,同时咱们还得行尾的校验和蓝色部分进行修改04->C9。
至此我们的合并工作全部完成。
Incoming search terms:
- S19文件合并工具
- freescale can bootloader在线程序升级
- freescale MCU s19 说明
- freescale s19
- S19
- s19 烧录
- 基于CAN总线的bootloader程序

