浅谈嵌入式软件开发之使用Srecord工具实现S19文件数据填充和CRC校验和自动计算与存储方法详解
作者按:本文介绍Srecord工具及其数据填充和CRC自动生成的方法适用于任意S19文件,与生成S19文件的工具链无关。强烈推荐用于处理S32DS IDE编译结果S19文件。
内容提要
引言
1. srec_info使用
2. srec_cmp使用
3. srec_cat使用
3.1 srec_cat的fill过滤器命令功能
3.2 srec_cat的checksum过滤器命令功能
4. Windows 命令行批处理脚本调用Srecord的srec_cat实现S19文件数据填充和CRC校验和自动计算的具体实现方法和步骤
5. 使用批处理脚本文件生成S32K144的CRC校验和
5.1 按照S32K144的Flash存储器空间设置数据填充和CRC校验自动生成参数
5.2 将批处理文件拷贝到要处理的S19文件所在目录,双击运行
总结
参考资料
引言
S32DS IDE使用的GNU GCC工具链没有提供对编译结果的CRC校验和自动生成工具,不能像CodeWarrior那样简单的通过prm链接文件关键词FILL和CHECKSUM进行数据填充和CRC校验和自动生成:
Tips: 关于CodeWarrior IDE应用工程实现S19文件数据填充和CRC校验和生成的方法,请参考以下公众号文章(点击文章标题即可直接跳转阅读):
《CodeWarrior IDE使用Tips之利用prm链接文件实现储存器数据填充和代码编译结果CRC校验和自动生成详解》;
为了实现对S32DS IDE应用工程编译结果生成的S19文件进行数据填充和CRC校验和自动生成,满足bootloader开发需求,本文给大家介绍一个功能强大的嵌入式MCU Flash编程文件编辑处理工具–Srecord, 它是一个开源的S19文件处理工具,其开发初衷时为用户提供处理EEPROM加载文件的强大工具集合,其官网和下载链接如下:
http://srecord.sourceforge.net/

将下载最新版本srecord-1.64-win32.zip压缩包解压,所得文件如下,包含Readme使用说明和3个具体的工具软件可执行文件以及一个pdf版本的用户手册:

Srecord提供了3个强大的命令行工具:
-
srec_info: 用于检索输入文件的基本信息,比如查看S19文件的起始地址;
-
srec_cmp: 用于比较两个输入文件,输出两个S19文件的比较结果,是否一致;
-
srec_cat: 这是最有用的工具,用于对输入文件进行抽取/增加/创建/合并(extract/add/create/merge/etc)等操作;
以上Srecord工具可以支持几乎所有的嵌入式MCU编译结果的Flash编程文件格式,比如常见的Motorola S19(S-record), Intel HEX和Binary二进制文件;其支持的完整Flash编程文件格式,请参考如下链接:
http://srecord.sourceforge.net/
1. srec_info使用
srec_info可以输出S19文件的基本信息,比如在window命令行中输入命令:
srec_info S32K144_App_TestPrj.srec
运行结果如下:
-
其解析出了输入编程文件的格式(Format)为:Motorola S-Record;
-
文件名(Header)为:“S32K144_App_TestPrj.srec”;
-
可执行程序起始地址(Execution Start Address): 0x411;
-
编程文件占用地址空间(Data): 0x0000~0x5633;

Tips: 由于Srecord不是正常安装的Windows软件程序,而且直接解压后使用的,所以运行以上测试时,需要进入Srecord的解压文件夹,并将测试S19文件也拷贝到该文件夹下;当然也可以通过Wimdow命令行的“set path = ”命令将Srecord的解压文件夹设置为Windows的系统临时环境变量使用;
Tips: 关于srec_info的使用,更多详情请参考如下链接:
http://srecord.sourceforge.net/man/man1/srec_info.html
2. srec_cmp使用
srec_cmp工具用于比较两个输入编程文件的存储器内容是否相同,跟Linux中的diff差不多;
比如输入以下命令:
srec_cmp app1.srec app2.srec
若两个S19文件的内容不同,则会输入如下信息:
srec_cmp: files "app1.srec" and "app2.srec" differ
Tips: 关于srec_cmp的使用,更多详情请参考如下链接:
http://srecord.sourceforge.net/man/man1/srec_cmp.html
3. srec_cat使用
srec_cat是Srecord最重要的功能程序,其名字取自英文concatenate的,意为连接多个输入文件,但其实它还提供了非常丰富的功能,比如:
-
Converting files–多种编程文件格式间的转换,比如S19转换为hex或者binary文件;
-
Inserting or removing data–编程文件数据的插入和删除;
-
Joining/splitting files–联合/分割编程文件;
-
Moving data–编译编程文件中的数据到指定的地址;
-
Fill in patterns or fill the blanks–按照指定模式填充编程文件中的空缺地址;
-
Creating data--创建编程数据/文件;
-
Changing data--改变已有编程文件的数据;
-
Creating multiple kinds of checksums–以及生成并添加编程数据的校验和;
本文件将用到srec_cat的fill和checksum两个过滤器(filter)功能命令,实现对S19文件的数据填充和CRC校验和自动计算与存储。
3.1 srec_cat的fill过滤器命令功能
srec_cat的fill命令可以实现对指定地址范围(address-range)的指定数据(value)填充,其命令格式如下:
−fill value address-range
Tips: srec_cat fill只支持按字节进行填充,即以上命令的参数value的取值范围只能是:0x00~0xFF;
3.2 srec_cat的checksum过滤器命令功能
srec_cat能够支持很多不同的<checksum_filer>来实现不同格式的CRC校验和生成和储存(储存地址为address,CRC长度/宽度为[ nbytes [ width ]],可选):
−<checksum_filer> address [ nbytes [ width ]]
常用的<checksum_filer>有:
CRC32_Big_Endianaddress [ modifier… ]:进行32-bit CRC校验和计算,结果按照大端模式储存,计算时,输入数据不连续的空缺地址将被自动忽略,字节按地址升序处理(而不是按它们在输入中出现的顺序)。其中modifier可以是以下输入:
|
−CCITT |
The CCITT calculation is performed. The initial seed is all one bits(0xFFFFFFFF). This is the default(默认值). |
|
−XMODEM |
An alternate XMODEM-style calculation is performed. The initial seed is all zero bits(0x00000000). |
CRC32_Little_Endianaddress[ modifier… ]:与CRC32_Big_Endian 功能类似,只是结果按照小端模式存储;
CRC16_Big_Endianaddress [ modifier… ]:进行16-bit CRC校验和计算,结果按照大端模式储存, 计算时,输入数据不连续的空缺地址将被自动忽略,字节按地址升序处理(而不是按它们在输入中出现的顺序)。其中modifier可以是以下输入:
number:设置CRC校验和多项式
−POLYnomialname,name可以是以下已知确切选项,对应不同的CRC多项式:

以及以下不同的选项:
|
−CCITT |
The CCITT calculation is performed. The initial seed is 0xFFFF. This is the default(默认值). |
|
−XMODEM |
The alternate XMODEM calculation is performed. The initial seed is 0x0000. |
|
−BROKEN |
A common-but-broken calculation is performed (see note 2 below). The initial seed is 0x84CF. |
CRC16_Little_Endianaddress [ modifier… ]:功能与CRC16_Big_Endian类似,只是结果按照小端模式存储;
Tips: crec_cat还支持很多其他的CRC校验和生成方法,这里限于篇幅限制,未做详细介绍,感兴趣的读者可以参考如下链接:
http://srecord.sourceforge.net/man/man1/srec_input.html;
4. Windows 命令行批处理脚本调用Srecord的srec_cat实现S19文件数据填充和CRC校验和自动计算的具体实现方法和步骤
根据以上介绍,我们可以编写一个Windows命令行批处理文件来调用Srecord的srec_cat实现S19文件数据填充和CRC校验和自动计算。具体步骤如下:
①进入当前目录(需要处理的S19文件所在目录,比如S32DS IDE应用工程的S19文件就是其根目录下以编译目标(e.g. Debug)命名的文件夹),以便srec_cat.exe读取要处理的S19文件;
REM enter current pathcd /d %~dp0
②设置事先下载并解压好的Srecord工具软件目录到Window系统环境变量,这样Windows命令行就可以直接调用相应的srec_cat.exe了;
REM add the srecord utility tools folder to pathset path=F:\Study\Srecord\srecord-1.64-win32
③设置临时变量决定srec_cat的输入和输入文件名,填充地址范围及填充值,生成CRC校验的方法及结果储存地址等等;
REM set input fileSET SRC=*.srecREM set the output fileSET APP=S32K144_App_Flash_Fill_Add_CRC.srecREM set the output fileSET FILL_VAL=0xAAREM set the MCU app flash start addressSET START_ADDR=0x00000REM set the MCU app flash end addressSET END_ADDR=0x7FFFCREM set the MCU flash address to store the checksum/CRC resultREM it's usually the end of MCU app Flash end address/the end of APP FlashSET CRC_ADDR=0x7FFFCREM set expected checksum/CRC methodSET CRC_method=CRC32_Big_Endian
④ 若输入目标文件已存在,则先将其删除
REM delete the last copy result if it exitif exist %APP% del %APP%
⑤调用srec_cat执行fill和checksum命令,完成数据填充和CRC自动生成并储存到指定存储器地址;
REM call srec_cat to execute memory fill and checksum auto-generate and store to specified addresssrec_cat %SRC% -fill %FILL_VAL% %START_ADDR% %END_ADDR% -%CRC_method% %CRC_ADDR% -o %APP%
⑥退出;
echo All commands have been executed successfuly!pause
5. 使用批处理脚本文件生成S32K144的CRC校验和
下面,我就以S32K144的一个简单应用工程为例,介绍如何使用上面的Srecord批处理脚本;
5.1 按照S32K144的Flash存储器空间设置数据填充和CRC校验自动生成参数
S32K144有512KB P-Flash,地址分布为0x00000~0x7FFFF,因此,配置数据填充(值为0xAA)和CRC校验区域为0x00000~0x7FFFC,校验和结果储存在地址0x7FFFC开始的最后4个字节;
校验和采样通用32-bit CCITTCRC大端结果进行储存(CRC32_Big_Endian,占用4个字节;
完整的批处理文件–Fill_And_CRC_Gen_Command.bat,如下:
@echo offREM enter current pathcd /d %~dp0REM add the srecord utility tools folder to pathset path=F:\Study\Srecord\srecord-1.64-win32REM set input fileSET SRC=*.srecREM set the output fileSET APP=S32K144_App_Flash_Fill_Add_CRC.srecREM set the output fileSET FILL_VAL=0xAAREM set the MCU app flash start addressSET START_ADDR=0x00000REM set the MCU app flash end addressSET END_ADDR=0x7FFFCREM set the MCU flash address to store the checksum/CRC resultREM it's usually the end of MCU app Flash end address/the end of APP FlashSET CRC_ADDR=0x7FFFCREM set expected checksum/CRC methodSET CRC_method=CRC32_Big_EndianREM delete the last copy result if it exitif exist %APP% del %APP%REM call srec_cat to execute memory fill and checksum auto-generate and store to specified addresssrec_cat %SRC% -fill %FILL_VAL% %START_ADDR% %END_ADDR% -%CRC_method% %CRC_ADDR% -o %APP%echo All commands have been executed successfuly!pause
5.2 将批处理文件拷贝到要处理的S19文件所在目录,双击运行
将以上批处理文件–Fill_And_CRC_Gen_Command.bat拷贝到S32K144 S32DS应用工程的编译目标–debug目录下,双击运行即可:

运行成功,将提示“All commands have been executed successfuly!”,同时在该目录下生成一个结果S19文件–S32K144_App_Flash_Fill_Add_CRC.srec:

执行填充和CRC计算之前,测试S19文件只占用0x0000~0x5623的0x5624字节,剩余地址空间无数据,下载到目标MCU后,为Flash擦除后的状态–0xFF:

执行以上脚本后,输出的结果S19文件–S32K144_App_Flash_Fill_Add_CRC.srec内容如下:
全部0x00000~0x7FFFF的512KB P-Flash空间都被填满:

填充数据为设置的0xAA,且最后4个字节储存了该S19文件的32-bit CRC校验和结果–0xAAC8CEAB(大端模式):

Tips: 关于S32DS IDE应用工程如何配置生成S19编程文件,请参考以下公众号文章(点击文章标题即可直接跳转阅读):
《S32DS IDE使用Tips之配置objcopy选项生成S3行的S19文件和指定每行S19文件的最大数据长度的方法和步骤详解》;
总结
Srecord的功能十分强大,本文只介绍了我们关心的数据填充和校验和自动生成功能。本文介绍的方法是编写Windows命令行的批处理区文件调用Srecord的srec-cat实现,其实Srecord也可以支持自己的命令文件输入:
<SrecordProgram> @filename
其中,<SrecordProgram>可以是srec-info,srec-cmp或者srec-cat,而filename则是一个txt文本文件,其中包含命令输入即可,比如:
srec_cat @crc_cmd.txt
在crc_cmd.txt文本文件中输入如下内容即可完成对KL25编译结果FRDM-KL25Z_CRC.srec的CRC自动生成;
# srec_cat command file to add the CRC and produce application file to be flashed# Usage: srec_cat @filename#first: create CRC checksumFRDM-KL25Z_CRC.srec # input file-fill 0xFF 0x0410 0x20000 # fill code area with 0xff-crop 0x0410 0x1FFFE # just keep code area for CRC calculation below (CRC will be at 0x1FFFE..0x1FFFF)-CRC16_Big_Endian 0x1FFFE -CCITT # calculate big endian CCITT CRC16 at given address.-crop 0x1FFFE 0x20000 # keep the CRC itself#second: add application fileFRDM-KL25Z_CRC.srec # input file-fill 0xFF 0x0410 0x1FFFE # fill code area with 0xff#finally, produce the output file-Output # produce outputFRDM-KL25Z_CRC_Added.srec
进而还可以将Srecord的srec_cat生成CRC校验和的功能集成到任意基于Eclipse的IDE(比如S32DS IDE)中,作为post-build命令来执行。
具体方法和步骤,请参考以下community链接:
“CRC Checksum Generation with ‘SRecord’ Tools for GNU and Eclipse”
https://mcuoneclipse.com/2015/04/26/crc-checksum-generation-with-srecord-tools-for-gnu-and-eclipse/
参考资料
-
Srecord用户手册:srecord-1.64.pdf,位于解压后根目录下;
-
Srecord官网提供的若干使用例程:http://srecord.sourceforge.net/man/man1/srec_examples.html
以上就是今天给大家分享的内容,希望对大家有所帮助~!
原创写作不易, 如果大家觉得本文对你的工作和学习有帮助,也欢迎大家赞赏鼓励或动动手指点击文章底部的“好看”、转发分享到朋友圈、微信和QQ技术交流群,让更多的小伙伴能够从我的文章中收益!—-我将坚持写作,给大家带来更多精彩的原创文章。
Tips:阅读更多精彩内容,请访问以下文章目录列表(点击文章标题直接跳转阅读):
《历史文章分类列表目录(点击文章标题即可直接跳转阅读,截止2019年7月15日)》;
本公众号已开通关键词回复功能,请在公众号主页回复如下关键词以获取更多信息和精彩文章:
-
关于作者,请回复关键词“作者简介”;
-
联系作者,请回复关键词“联系作者”;
-
获取高清PDF版本公众号文章,请回复关键词“获取文章”;
-
获取专业及时的技术支持服务,请回复关键词“专业服务”;
-
下载2017~2018年度原创技术文章集合高清PDF,请回复关键词“文章全集”;
-
CodeWarrior IDE license购买及安装使用问题咨询,请回复关键词“CW License”;
-
汽车以太网转工业以太网转换器购买,请回复关键词“以太网转换器购买”;
-
获取最新最全的公众号原创技术分享文章目录,请回复关键词“文章目录”;
郑重声明:本公众号所有原创技术文章免费阅读,文中所有观点/结论均为个人观点,不代表任何公司官方观点意见;所有demo代码/程序,仅作参考学习,不保证质量,若用于商业用途,责任自负;所有本公众号文章,版权归本人所有知识产权,一切未经本人同意的转载均属违法,盗版必究~!
如果你喜欢本公众号的文章,请点击文章最开始的公众号关注或微信直接长按扫描识别下方二维码关注,你也可以在微信添加朋友–>公众号–>输入”汽车电子expert成长之路“搜索–>点击关注。若对本文观点有任何意见和建议也欢迎留言指出。
您的关注、点赞、转发分享是对我辛勤写作的最大肯定!

Enwei Hu(胡恩伟)
2019年7月23日于山城·重庆.
夜雨聆风
