• 痞子衡嵌入式:探析开启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主页知乎主页微信公众号 平台上。

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

  • 相关阅读:
    springMVC总结
    spring总结
    dubbo文档
    mysql集群
    JVM-优化
    JVM-GC日志打印
    JVM-垃圾回收
    JVM-问题定位示例
    C++11
    《疯狂的程序员》
  • 原文地址:https://www.cnblogs.com/henjay724/p/14043987.html
Copyright © 2020-2023  润新知