痞子衡嵌入式:探析开启CRC完整性校验的IAR工程生成.out和.bin文件先后顺序


  大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是开启CRC完整性校验的IAR工程生成.out和.bin文件先后顺序问题

  痞子衡之前写了一篇 《在IAR开发环境下为工程开启CRC完整性校验功能的方法》,有同事在使用CRC校验功能时遇到了关于.out/.bin文件先后生成顺序的问题。我们在线调试IAR工程时,调试器下载的其实是可执行文件(.out),CRC校验功能在.out文件里没有任何歧义,但是更多时候我们会使用镜像文件(.bin)来下载量产,有时候CRC校验功能在.bin文件里却没有正常开启,这是怎么回事?痞子衡为你解惑:

一、使用IAR生成镜像文件

  抛开CRC完整性校验功能,以一个正常嵌入式工程来说,比如 SDK_2.8.2_FRDM-K64Foardsfrdmk64fdemo_appshello_worldiar,这个工程正常编译链接后一定会生成.out可执行文件(其实就是标准.elf文件)。如果我们希望同时能生成一个.bin镜像文件,需要借助工程选项Output Converter:

  在Output Converter可以指定生成镜像文件格式,常见的镜像格式(.bin/hex/.s19)都支持。如果你了解IAR你应该知道这个功能其实是调用 IAR SystemsEmbedded Workbench 8.50.6arminielftool.exe 工具实现的:

ielftool --bin sourceFile.out destinationFile.bin
ielftool --ihex sourceFile.out destinationFile.hex
ielftool --srec sourceFile.out destinationFile.s19

  我们编译工程看一下编译信息,从日志输出顺序来看,首先生成了hello_world.out(蓝色框标出),然后调用了ielftool工具执行转换命令(绿色框标出),最后生成了hello_world.bin(红色框标出):

二、比较两种CRC校验开启方法

  《在IAR开发环境下为工程开启CRC完整性校验功能的方法》 一文中介绍了两种开启CRC完整性校验功能的方法,我们从生成.out/.bin文件顺序的角度来分析一次结果:

2.1 基于Checksum功能

  分析开启Checksum功能的工程编译结果,可以发现日志输出顺序如下:

1. 调用ielftool实现添加CRC校验功能(蓝色框)
2. 生成了包含正确CRC校验值的.out文件(绿色框)
3. 调用ielftool实现文件格式转换(红色框)
4. 生成了包含正确CRC校验值的.bin文件(黄色框)

  这种情况下,.out文件和.bin文件虽然生成先后顺序不同,但都包含了正确的CRC校验值,因此在CRC验证使用上是一致的。

2.2 基于Post-build功能

  再来分析开启Post-build功能的工程编译结果,可以发现日志输出顺序如下:

1. 生成了默认CRC校验值的.out文件(蓝色框)
2. 调用ielftool实现文件格式转换(绿色框)
3. 生成了包含默认CRC校验值的.bin文件(红色框)
4. 调用ielftool实现添加CRC校验功能(黄色框)
5. 生成了包含正确CRC校验值的.out文件(紫色框)

  这种情况下,.out文件和.bin文件生成先后顺序不同,但是.bin里只是默认的CRC校验值(全0),并不是期望的正确CRC校验值,因此无法用于后面的CRC验证,这也是我同事遇到的问题。

三、解决Post-build下.bin/.out一致性问题

  现在让我们来解决我同事遇到的Post-build下.bin和.out里CRC校验值不一致问题,显然无法直接使用工程选项Output Converter功能了,因为它在IAR里执行顺序没法改变。

  我们需要额外写一个如下post-build.bat脚本,在bat脚本里实现CRC校验功能添加以及文件格式转换,这样我们就能控制文件生成顺序。

set OUT=%1.out
set BIN=%1.bin

ielftool --fill="0xFF;__checksum_begin-__checksum_end" --checksum="__checksum:4,crc32:p,0xffffffff;__checksum_begin-__checksum_end" --verbose %OUT% %OUT%

ielftool --bin --verbose %OUT% %BIN%

  将post-build.bat脚本放到工程文件同路径下,并重新使用Post-build来执行这个脚本,传入脚本的参数是$TARGET_BPATH$,即不含工程目标文件后缀的全路径,再次编译工程后就可以得到包含正确CRC校验值的.bin文件了,问题解决,大功告成!

备注:post-build.bat脚本正常执行的前提是,ielftool工具的路径需要在系统环境变量里。

  至此,开启CRC完整性校验的IAR工程生成.out和.bin文件先后顺序问题痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

文章会同时发布到我的 博客园主页CSDN主页知乎主页微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

原文地址:https://www.cnblogs.com/henjay724/p/14043987.html