大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是开启 CRC 完整性校验的 IAR 工程生成 .out 和 .bin 文件先后顺序问题。
痞子衡之前写了一篇 《在 IAR 开发环境下为工程开启 CRC 完整性校验功能的方法》,有同事在使用 CRC 校验功能时遇到了关于 .out/.bin 文件先后生成顺序的问题。我们在线调试 IAR 工程时,调试器下载的其实是可执行文件(.out),CRC 校验功能在 .out 文件里没有任何歧义,但是更多时候我们会使用镜像文件(.bin)来下载量产,有时候 CRC 校验功能在 .bin 文件里却没有正常开启,这是怎么回事?痞子衡为你解惑:
一、使用 IAR 生成镜像文件
抛开 CRC 完整性校验功能,以一个正常嵌入式工程来说,比如 \SDK_2.8.2_FRDM-K64F\boards\frdmk64f\demo_apps\hello_world\iar\,这个工程正常编译链接后一定会生成 .out 可执行文件(其实就是标准 .elf 文件)。如果我们希望同时能生成一个 .bin 镜像文件,需要借助工程选项 Output Converter:
在 Output Converter 可以指定生成镜像文件格式,常见的镜像格式(.bin/hex/.s19)都支持。如果你了解 IAR 你应该知道这个功能其实是调用 \IAR Systems\Embedded Workbench 8.50.6\arm\bin\ielftool.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 来执行这个脚本,传入脚本的参数是,即不含工程目标文件后缀的全路径,再次编译工程后就可以得到包含正确 CRC 校验值的 .bin 文件了,问题解决,大功告成!
备注:post-build.bat 脚本正常执行的前提是,ielftool 工具的路径需要在系统环境变量里。
至此,开启 CRC 完整性校验的 IAR 工程生成 .out 和 .bin 文件先后顺序问题痞子衡便介绍完毕了,掌声在哪里~~~