大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是利用IAR自带CRC完整性校验功能的一次实践(为KBOOT加BCA)

  痞子衡之前写过两篇关于IAR中自带CRC校验功能的文章 《在IAR开发环境下为工程开启CRC完整性校验功能的方法》《探析开启CRC完整性校验的IAR工程生成.out和.bin文件先后顺序》,算是把这个功能细节介绍得比较清楚了,但是俗话说得好,理论懂得再多,不能用于实践那等于没学。今天痞子衡就利用这个功能来解决一个实际需求:

一、KBOOT中BCA填入CRC校验需求

  说起这个需求,记得那是2014年的第一场雪,那时候痞子衡正在飞思卡尔软件组参与Kinetis Bootloader项目(简称KBOOT)的研发,痞子衡为这个项目写过一些文章,详见 《飞思卡尔Kinetis系列MCU开发那些事》 里的启动篇系列,Kinetis是飞思卡尔当时主推的Cortex-M微控制器,KBOOT就是为Kinetis设计的全功能Bootloader,这可能是嵌入式世界里第一个精心设计的通用架构Bootloader。这个Bootloader包含一个用户配置功能(BCA),简单说就是在用户Application的偏移0x3c0 - 0x3ff这16个word存放一些Bootloader配置,当Bootloader运行时会先尝试从Application区域读出这16个word,获取用户配置(超时时间、外设类型、id、速度选项等),然后根据用户配置再去启动或升级用户Application。

  CRC完整性校验功能占据了BCA里的12个byte,是一个很重要的Bootloader特性,其完整功能详见 《KBOOT特性(完整性检测)》,今天痞子衡要说的需求就是直接在Application工程编译时生成包含正确CRC相关参数的BCA,而不是像以前那样在最终binary文件里二次编辑添加。

  我们以MK64FN1M这颗芯片为例,下载它的软件包,软件包里有KBOOT及其示例Application,找到 \SDK_2.8.2_FRDM-K64F\boards\frdmk64f\bootloader_examples\demo_apps\led_demo_freedom_a000\iar 下的Application工程,工程源文件 startup_MK64F12.s 里定义了__bootloaderConfigurationArea,但是CRC区域是全0xFF(即没有使能),编译生成的bin文件里CRC区域也是全0xFF,我们要做的就是填入正确的CRC。

二、开始动手实践

2.1 确定匹配的CRC算法参数设置

  在KBOOT用户手册里可以找到其CRC具体算法,它使用的是比较主流的CRC32-MPEG2分支,具体参数如下表所示:

  为了方便核对结果,痞子衡找了一个在线CRC计算的网站,利用这个网站,设置与KBOOT一致的CRC参数(下图红色框内),然后我们选取led_demo_freedom_a000.bin的前16个字节(下图蓝色框内)作为测试数据输入,点击Calculate CRC按钮生成结果0x8D96BDF0(下图紫色框内)。

在线网站: http://www.sunshine2k.de/coding/javascript/crc/crc_js.html

  我们现在回到led_demo_freedom_a000工程,在Linker/Checksum下,使能CRC功能,为了与上述测试一致,CRC计算范围设为 0xa000 - 0xa00f(因为程序起始链接地址是0xa000,所以也就是最终.bin里的前16个字节)。查阅IAR development手册,做了如下CRC算法参数设置,编译工程得到结果也是0x8D96BDF0,因此CRC设置是匹配的。

2.2 填充BCA的首次尝试

  确认了CRC设置,现在就是修改源代码了,在BCA的CRC区域里将初始的0xFF值全部更换为真实的CRC设置值__checksum、__checksum_begin、__checksum_end,代码简单修改如下。重编工程后查看.bin文件,发现起止范围两个参数是对的,但是CRC校验值并不对,填成了0x0000a7fc,查看map文件得知这是__checksum的链接地址,并不是__checksum的值。想想也是,CRC校验值是链接生成bin后才计算的,但源文件是在链接前编译的,不可能在编译时得到链接后的结果。

2.3 填充BCA的最终方案

  首次尝试失败,事情远没有想象得那么简单,我们需要在工程链接文件上动心思,要直接把__checksum链接到BCA里的具体偏移位置。因此startup_MK64F12.s 里__bootloaderConfigurationArea从crcExpectedValue及其之后全部去掉,并且__FlashConfig也实际不需要(仅对于链接在0地址才有效,这是Kinetis特性)。

  然后我们需要重新在main.c里定义一个bca常量数组,把除crcExpectedValue之外缺失的BCA数据全部放进去。

const uint32_t bca[16] @ ".bca_left" = {0x1388ffff, 0xffffffff, 0xffffffff, 0xffffffff,
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff};

  最后我们需要修改链接文件MK64FN1M0xxx12_application_0xA000.icf如下:

//place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec, readonly section .noinit };
//place in FLASH_region { block ApplicationFlash };
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place at address mem:0xa3cc { ro section .checksum };
place at address mem:0xa3d0 { ro section .bca_left };
place in FLASH_region { readonly section .noinit, block ApplicationFlash };

  经过这么一番操作,让我们重新编译工程再看bin里结果,哈哈,这次BCA果然是正确的CRC校验值了(这次值是0xf62ce2b6,发生了变化,因为源代码的改动,bin前16个字节内容也相应变化了),大功告成。底下的事情就简单了,在CRC设置界面里调整想要的CRC计算范围即可。

  至此,利用IAR自带CRC完整性校验功能的一次实践(为KBOOT加BCA)痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

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

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

痞子衡嵌入式:一次利用IAR自带CRC完整性校验功能的实践(为KBOOT加BCA)的更多相关文章

  1. 痞子衡嵌入式:在IAR开发环境下为工程开启CRC完整性校验功能的方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下为工程开启CRC完整性校验功能的方法. CRC校验在嵌入式领域里的应用非常广,比如在通信领域,CRC检验值可以作为数据 ...

  2. 痞子衡嵌入式:深扒IAR启动函数流程之段初始化函数__iar_data_init3实现

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR启动函数流程里的段初始化函数__iar_data_init3实现. 本篇是 <IAR启动函数流程及其__low_level_ ...

  3. 痞子衡嵌入式:深扒IAR启动函数流程及其__low_level_init设计对函数重定向的影响

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR启动函数流程及其__low_level_init设计对函数重定向的影响. 上一篇文章 <IAR下RT-Thread工程自定义 ...

  4. 痞子衡嵌入式:深扒IAR启动函数流程之段初始化实现中可用的压缩选项

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR启动函数流程里段初始化实现中可用的压缩选项. 接着 <IAR启动函数流程之段初始化函数__iar_data_init3实现& ...

  5. 痞子衡嵌入式:SNVS Master Key仅在i.MXRT10xx Hab关闭时才能用于DCP加解密

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT系列中数据协处理器DCP使用SNVS Master Key加解密的注意事项. i.MXRT不仅仅是处理性能超强的MCU,也是 ...

  6. 痞子衡嵌入式:浅谈i.MXRT1xxx系列MCU时钟相关功能引脚的作用

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1xxx系列MCU时钟相关功能引脚作用. 如果我们从一颗 MCU 芯片的引脚分类来看芯片功能,大概可以分为三大类:电源.时钟 ...

  7. 痞子衡嵌入式:ARM Cortex-M内核那些事(3)- 功能模块

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是ARM Cortex-M功能模块. ARM Cortex-M处理器家族发展至今(2016),已有5代产品,分别是CM0/CM0+.CM1 ...

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

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是开启CRC完整性校验的IAR工程生成.out和.bin文件先后顺序问题. 痞子衡之前写了一篇 <在IAR开发环境下为工程开启CRC ...

  9. 痞子衡嵌入式:利用i.MXRT1xxx系列ROM提供的FlexSPI driver API可轻松IAP

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT系列ROM中的FlexSPI驱动API实现IAP. 痞子衡的技术交流群里经常有群友提问: i.MXRT中的FlexSPI驱动 ...

随机推荐

  1. 【译】Ringbahn的两个内存Bug

    原文链接:https://without.boats/blog/two-memory-bugs-from-ringbahn/ 原文标题:Two Memory Bugs From Ringbahn 公众 ...

  2. python机器学习实现K-近邻算法(KNN)

    机器学习 K-近邻算法(KNN) 关注公众号"轻松学编程"了解更多. 以下命令都是在浏览器中输入. cmd命令窗口输入:jupyter notebook 后打开浏览器输入网址htt ...

  3. C++语言学习之STL 的组成

    STL有三大核心部分:容器(Container).算法(Algorithms).迭代器(Iterator),容器适配器(container adaptor),函数对象(functor),除此之外还有S ...

  4. Java入门(5)

    阅读书目:Java入门经典(第7版) 作者:罗格斯·卡登海德 protected变量只能在其所在的类,该类的子类,以及同一个包里的其他类中使用.包是一组用于完成相同目标的相关类. private变量只 ...

  5. Docker - 解决 gitlab 容器上的项目进行 clone 时,IP 地址显示一串数字而不是正常 IP 地址的问题

    问题背景 通过 gitlab 容器创建了一个项目,想 clone 到本地,结果发现项目的 IP 地址是一串数字 问题排查 明明创建项目的时候,IP 地址还是正常的鸭! 再看看项目的 settings ...

  6. 14Flask重要知识

    一,李辉<Flask Web开发实战> 1,内网穿透 内网穿透工具可以快速让flask项目运行: 1,https://localtunnel.github.io/www/ 2,https: ...

  7. 洛谷日报 & 原来博客(转载)

    震惊,新的功能:可以按Ctrl + F 进行关键字查询. \(update\) on 10.26:把这两个月的日报也加入进去了,并且修复了几个错误. 本文会把小编用过的博客和比较好的博客放在这里. 可 ...

  8. ClassNotFoundException: java.util.ArrayList$SubList 错误

    ClassNotFoundException: java.util.ArrayList$SubListjava.lang.RuntimeException: java.lang.ClassNotFou ...

  9. 企业网络拓扑MSTP功能实例(二)

    组网图形 MSTP简介 以太网交换网络中为了进行链路备份,提高网络可靠性,通常会使用冗余链路.但是使用冗余链路会在交换网络上产生环路,引发广播风暴以及MAC地址表不稳定等故障现象,从而导致用户通信质量 ...

  10. 看看poll 事件掩码 --- review代码时发现掩码不分的错误

    事件 描述 是否可作为输入(events) 是否可作为输出(revents) POLLIN 数据可读(包括普通数据&优先数据) 是 是 POLLOUT 数据可写(普通数据&优先数据) ...