• 324查看
  • 0回复

[应用层软件] CodeWarrior IDE使用Tips之如何设置应用工程生成S19文件的代码和数据行类型和行长...

[复制链接]


该用户从未签到

发表于 9-3-2024 21:47:39 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


内容提要

引言

1. S19文件详解(行类型和行长度)

1.1 S19文件概述

1.2. S19文件格式定义及含义

1.3. S19文件示例

1.4 S19文件必要的S行类型和支持的最大行数据/代码长度

2. CodeWarrior 5.1/2 IDE应用工程的生成S19文件的过程详解

2.1 S12(X)系列MCU的CodeWarrior 5.1/2 IDE应用工程生成的S19文件

2.2 S12(X)系列MCU的CodeWarrior 5.1/2 IDE应用工程的burner.bll(地址转换控制脚本)

3. 配置CodeWarrior 5.1/2 IDE应用工程生成S19文件的代码和数据行类型和行长度

3.1  设置CodeWarrior 5.1/2 IDE应用工程生成S19文件的代码和数据行类型

3.2  设置CodeWarrior 5.1/2 IDE应用工程生成S19文件的代码和数据最大行长度

总结

引言
最近有读者提问,如何设置让S12(X)系列MCU的CodeWarrior 5.1/2 IDE应用工程让其生成的S19文件只包含S2类型的数据行(line type),且能够指定行长度(line length)。其目的是为了简化bootloader开发中S19文件的解析和保证应用程序代码和数据的对齐以及提高S19文件的传输效率(S19文按行传输,在目标MCU上解析)。
为此,本文就来给大家详解介绍一下具体的设置方法,希望对大家有所帮助和启发。
1. S19文件详解(行类型和行长度)
首先,我们有必要了解一下S19文件的格式。
1.1 S19文件概述
S19文件也称作S-Record(S记录文件),是由Motorola定义的一种通用计算机程序(code)和数据(data)编程/烧录文件格式,由于其每一行数据/代码记录均以ASCII码的字母“S”开头,后面紧跟“0~9”的数字标识其行类型,从而得名。S19文件与Intel定义的HEX文件以及bin文件一起是目前嵌入式MCU量产时Flash和EEPPROM离线编程的三大通用编程/烧录文件格式。
S19文件是ASCII编码的文本文件,可以使用任意文本编辑器打开和编辑,常见的S19文件名后缀包括:


    .s19(CodeWarrior 6.3/5.x和10.x/11.x IDE默认应用工程)

    .glo(CodeWarrior 5.1/2 IDE S12(X)系列MCU的全局地址编程文件)

    .mot(CodeWarrior 2.10、10.x/11.x Qorivva MPC56xx系列MCU应用工程)

    .srec(S32DS IDE应用工程)

1.2. S19文件格式定义及含义
S19文件中的每一行称为一个S记录,每个S记录由记录类型(line type)、记录长度(line length)、存储地址(address)、代码/数据、校验和(checksum)5个部分组成。
每字节数据被编码成2个16进制ASCII字符,第一个字符代表数据的高四位,第二个字符代表数据的低4位。
S19文件每一行S记录的5个部分具体内容如下:
① 记录类型:2个字符(即1个字节),用来描述记录的类型。记录总共定义了8种类型:


    S0:S19文件的第一个记录,表示文件名(含路径),存储地址部分没有使用,以0000置位。

    此记录表示记录的开始,无需下载到MCU。

    S1: 地址为2字节(4个字符)的记录。

    S2: 地址为3字节的记录。

    S3: 地址为4字节的记录。

    S5: 标记本文件的S1、S2、S3记录的个数(此记录不是一个S文件所必须的)。

    S7: 地为4字节,表示程序的开始执行地址,代码/数据部分没有被使用,此行表示程序的结束,无需下载到MCU。

    S8: 地为3字节,表示程序的开始执行地址,代码/数据部分没有被使用,此行表示程序的结束,无需下载到MCU。

    S9: 地为2字节,表示程序的开始执行地址,代码/数据部分没有被使用,此行表示程序的结束,无需下载到MCU。

② 记录长度: 2个字符(即1个字节),显示在记录中剩余的字节数。即记录长度 = 存储地址字节数 + 代码/数据字节数 + 校验和字节数
③ 存储地址: 2或3或4个字节(由记录类型决定),用来表示代码/数据应该装载的起始地址。
④ 代码/数据: 0-64字符(即0-32字节),表示需要下载到MCU中的数据。
⑤ 校验和: 2个字符(即1字节),校验数据,计算方法:校验和 = 0xFF– (记录长度 + 存储地址 + 代码/数据)(注意,为校验和不是字符的校验和,而是实际二进制数的校验和)
1.3. S19文件示例S01F0000443A5C50726F6A6563745F335C62696E5C50726F6A6563742E61627371S123C000CF2100C6055B134A800BFE4A8000FE0000C015C031000000000000000000000092S218FE8020F2FEC013EC31270BED31180A30700434F920F10A0BS9030000FC
说明:
第一行:S0,表示S19文件格式开始;1F为剩余字节数;0000无用;443A5C50726F6A6563745F335C62696E5C50726F6A6563742E616273为D:\Project_3\bin\Project_3.abs.的ASCII码;71为校验和.
第二行:S1,表示本条记录存储地址长度为2字节;23(注意为16进制)剩余字节数,C000,表示起始地址,92表示校验和。即,本行表示将CF2100C6055B134A800BFE4A8000FE0000C015C0310000000000000000000000依次下载到从地址C000开始的一段连续地址中。
第三行:S2,表示本条记录存储地址长度为3字节,18(16进制数)表示剩余字节数,FE8020表示起始地址,0B为校验和。校验和的计算:以S2记录为例,校验和 = 0xFF – (0xFE + 0×80 + 0×20 + 0Xf2 + … + 0x0A);
1.4 S19文件必要的S行类型和支持的最大行数据/代码长度
从以上S19文件格式的介绍可知,对于代码/数据编程来说,只需要S19中的S1/S2/S3三种S行记录即可。也就是只有S1/S2/S3行包含的应用程序数据/代码二进制结果会被调试器/编程器下载(编程)到目标MCU的Flash/EEPROM存储器中。
另外,由于S19文件每一行S记录的长度为一个字节(8-bit),即256个字节。而记录长度 = 存储地址字节数(2/3/4对应S1/S2/S3类型) + 代码/数据字节数 + 校验和字节数(1).
因此,S19文件每个S行记录能够包含的最大数据/代码长度为 256 - (2/3/4) - 1 = 253(S1类型)/252(S2类型)/251(S3类型)。
2. CodeWarrior 5.1/2 IDE应用工程的生成S19文件的过程详解
2.1 S12(X)系列MCU的CodeWarrior 5.1/2 IDE应用工程生成的S19文件
在S12(X)系列MCU的CodeWarrior 5.1/2 IDE应用工程编译之后默认会在其工程目录的bin文件夹下生成Project.abs.glo和Project.abs.s19两个S19文件,前者使用全局地址(global address,也称作物理地址,physical address),用于离线编程器(比如PEMicro的Cyclone系列离线编程器)在产线上进行批量Flash/EEPROM编程,后者则使用应用工程提供的prm链接文件所包含的逻辑地址(logical adress,包含本地地址(loca address,也称作未分页地址,non-bandked/non-paged address)和分页地址(bandked/paged address))是调试器(比如PEMicro的Multilink系列debugger或者OSBDM)在线调试时下载 abs文件使用。
CodeWarrior IDE使用Tips之如何设置应用工程生成S19文件的代码和数据行类型和行长度详解w1.jpg

虽然直接打开,其中的地址和S行类型不同(因为使用不同类型的地址,全局地址为24-bit地址,必须使用S2行,而逻辑地址中既包含16-bit的本地地址也包含24-bit的分页地址,需要使用S1或者S2行),但是其中包含的实际代码和数据内容是相同的,都来自应用工程的abs文件(elf文件,包含调试信息和编程数据):
CodeWarrior IDE使用Tips之如何设置应用工程生成S19文件的代码和数据行类型和行长度详解w2.jpg

Tips:关于S12(X)系列MCU的片上存储器资源和分页访问机制以及各种类型地址的使用方法,请参考我公众号的以下文章(点击文章标题即可直接跳转阅读):
《S12(X)系列MCU的片上存储器资源与分页访问机制详解》;
2.2 S12(X)系列MCU的CodeWarrior 5.1/2 IDE应用工程的burner.bll(地址转换控制脚本)
S12(X)系列MCU的CodeWarrior 5.1/2 IDE应用工程创建时,会自动添加目标MCU的全局地址和逻辑地址转换控制脚本文件--burner.bll(位于工程浏览器窗口,应用工程-->Project Settings --> Linker Files虚拟目录下,实际保存于应用工程目录的prm文件夹下):
CodeWarrior IDE使用Tips之如何设置应用工程生成S19文件的代码和数据行类型和行长度详解w3.jpg

在用户编译应用工程时,CodeWarrior IDE工具链会自动调用预处理器(preprocessor)、汇编器(assembler)和C编译器(C compiler)将应用工程包含的汇编语言和C语言代码编译成二进制目标文件(object file),并调用链接器(linker)根据工程的prm链接文件提供的目标MCU存储器地址分区和链接规则链接成二进制可执行文件(Project.abs),最后再调用地址转换工具burner,根据上面burner.bll的输入,在应用工程目录的bin文件夹下生成Project.abs.glo和Project.abs.s19两个S19文件。
Tips:关于CodeWarrior IDE的burner工具的使用方法,请参考我公众号的以下文章(点击文章标题即可直接跳转阅读):
《CodeWarrior IDE使用Tips之burner工具使用详解(实现不同类型存储器地址间的转换和NVM编程格式文件的输出)》;《CodeWarrior IDE使用Tips--使用burner将elf文件转换生成HEX和BIN文件的方法和步骤详解》;
3. 配置CodeWarrior 5.1/2 IDE应用工程生成S19文件的代码和数据行类型和行长度
基于以上介绍,下面我们来看看如何通过修改CodeWarrior 5.1/2 IDE应用工程的burner.bbl配置生成指定代码和数据行类型和行长度的S19文件。
3.1  设置CodeWarrior 5.1/2 IDE应用工程生成S19文件的代码和数据行类型
CodeWarrior 5.1/2 IDE应用工程默认生成的Project.abs.glo和Project.abs.s19文件中的代码和数据行类型是根据实际地址长度确定的,比如,Project.abs.s19文件,就会包含S1行和S2行:
CodeWarrior IDE使用Tips之如何设置应用工程生成S19文件的代码和数据行类型和行长度详解w4.jpg

而文件中,则只有S2行,因为其包含的地址为24-bit的全局地址:
CodeWarrior IDE使用Tips之如何设置应用工程生成S19文件的代码和数据行类型和行长度详解w5.jpg

对应burner.bll脚本文件中,全局地址S19文件(Project.abs.glo)的行类型:
CodeWarrior IDE使用Tips之如何设置应用工程生成S19文件的代码和数据行类型和行长度详解w6.jpg

和逻辑地址S19文件(Project.abs.s19)的行类型:
CodeWarrior IDE使用Tips之如何设置应用工程生成S19文件的代码和数据行类型和行长度详解w7.jpg

配置都是:SRECORD = Sx,即自动匹配。
为了让应用工程生成的代码和数据行都是使用24-bit地址的S2行类型,只需要将burner.bll脚本文件中全局地址和逻辑地址S19文件生成的行类型配置为:SRECORD = S2,即使用24-bit地址S2行。
CodeWarrior IDE使用Tips之如何设置应用工程生成S19文件的代码和数据行类型和行长度详解w8.jpg

CodeWarrior IDE使用Tips之如何设置应用工程生成S19文件的代码和数据行类型和行长度详解w9.jpg

重新编译应用工程,即可生成使用24-bit地址的S2行类型S19文件:
CodeWarrior IDE使用Tips之如何设置应用工程生成S19文件的代码和数据行类型和行长度详解w10.jpg

Note:S19文件使用的行类型,必需要能够cover真实目标存储器地址的宽度,比如ABS中文件中包含使用24-bit的全局地址的代码和数据,在burner.bll中,我们就只能设置使用S2(24-bit地址)或者S3(32-bit地址)行类型,而不能使用S1行类型。
3.2  设置CodeWarrior 5.1/2 IDE应用工程生成S19文件的代码和数据最大行长度
CodeWarrior 5.1/2 IDE应用工程默认生成的Project.abs.glo和Project.abs.s19文件,由于应用工程的burner.bll脚本文件中,省略了代码和数据行记录的最大行长度(SLINELEN)的配置,所以使用默认的最大长度,也就是32 (0x20)字节:
CodeWarrior IDE使用Tips之如何设置应用工程生成S19文件的代码和数据行类型和行长度详解w11.jpg

因此,我们只要在应用工程的burner.bll脚本文件中手动添加代码和数据行记录的最大行长度(SLINELEN)配置,并指定想要的长度即可,比如设置为64:
CodeWarrior IDE使用Tips之如何设置应用工程生成S19文件的代码和数据行类型和行长度详解w12.jpg

CodeWarrior IDE使用Tips之如何设置应用工程生成S19文件的代码和数据行类型和行长度详解w13.jpg

然后,重新编译应用工程,即可生成代码和数据行记录的最大行长度(SLINELEN)为64的S19文件:
CodeWarrior IDE使用Tips之如何设置应用工程生成S19文件的代码和数据行类型和行长度详解w14.jpg

CodeWarrior IDE使用Tips之如何设置应用工程生成S19文件的代码和数据行类型和行长度详解w15.jpg

Note:在burner.bll中,配置的S19文件代码和数据行记录的最大行长度(SLINELEN)不能超过S19文件格式本身的限制:
S19文件每个S行记录能够包含的最大数据/代码长度为 256 - (2/3/4) - 1 = 253(S1类型)/252(S2类型)/251(S3类型)。
Tips:为了提高Flash编程效率,通常S19文件的代码和数据行最大长度设置为Flash/EEPROM存储器的ECC单元长度(8字节或者4字节)的整数倍。
Tips:当应用程序(APP)采用S19文按行传输,在目标MCU上解析的bootloader开发方案时,S19文件每个记录行包含的代码和数据长度越长,bootloader的通信传输效率越高。
总结
本文虽然以S12XEP100的CodeWarrior 5.2 IDE样例工程进行介绍,其方法通用适用于CodeWarrior 6.3和CodeWarrior 10.x/11.x IDE的S08和MagniV S12Z系列MCU的应用工程。
在实际的bootloader开发中,为了保证应用程序生成的程序和数据能够按照目标MCU Flash和EEPROM的编程要求严格对齐,还需要实现数据填充,并对整个S19文件进行CRC校验,从而保证应用程序传输的完整。关于CodeWarrior IDE中如何通过prm文件命令实现S08、S12(X)和MagniV S12Z系列MCU的未使用Flash/EEPROM存储器空间的自动指定值填充和CRC计算,请参考如下公众号文章(点击文章标题即可直接跳转阅读):
《CodeWarrior IDE使用Tips之利用prm链接文件实现储存器数据填充和代码编译结果CRC校验和自动生成详解》;
以上就是今天要给大家分享的内容,希望对大家有所帮助和启发。

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 1-2-2025 07:44 , Processed in 0.448564 second(s), 32 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.