痞子衡嵌入式:一次利用IAR自带CRC完整性校验功能的实践(为KBOOT加BCA)
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是利用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)的更多相关文章
- 痞子衡嵌入式:在IAR开发环境下为工程开启CRC完整性校验功能的方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下为工程开启CRC完整性校验功能的方法. CRC校验在嵌入式领域里的应用非常广,比如在通信领域,CRC检验值可以作为数据 ...
- 痞子衡嵌入式:深扒IAR启动函数流程之段初始化函数__iar_data_init3实现
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR启动函数流程里的段初始化函数__iar_data_init3实现. 本篇是 <IAR启动函数流程及其__low_level_ ...
- 痞子衡嵌入式:深扒IAR启动函数流程及其__low_level_init设计对函数重定向的影响
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR启动函数流程及其__low_level_init设计对函数重定向的影响. 上一篇文章 <IAR下RT-Thread工程自定义 ...
- 痞子衡嵌入式:深扒IAR启动函数流程之段初始化实现中可用的压缩选项
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR启动函数流程里段初始化实现中可用的压缩选项. 接着 <IAR启动函数流程之段初始化函数__iar_data_init3实现& ...
- 痞子衡嵌入式:SNVS Master Key仅在i.MXRT10xx Hab关闭时才能用于DCP加解密
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT系列中数据协处理器DCP使用SNVS Master Key加解密的注意事项. i.MXRT不仅仅是处理性能超强的MCU,也是 ...
- 痞子衡嵌入式:浅谈i.MXRT1xxx系列MCU时钟相关功能引脚的作用
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1xxx系列MCU时钟相关功能引脚作用. 如果我们从一颗 MCU 芯片的引脚分类来看芯片功能,大概可以分为三大类:电源.时钟 ...
- 痞子衡嵌入式:ARM Cortex-M内核那些事(3)- 功能模块
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是ARM Cortex-M功能模块. ARM Cortex-M处理器家族发展至今(2016),已有5代产品,分别是CM0/CM0+.CM1 ...
- 痞子衡嵌入式:探析开启CRC完整性校验的IAR工程生成.out和.bin文件先后顺序
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是开启CRC完整性校验的IAR工程生成.out和.bin文件先后顺序问题. 痞子衡之前写了一篇 <在IAR开发环境下为工程开启CRC ...
- 痞子衡嵌入式:利用i.MXRT1xxx系列ROM提供的FlexSPI driver API可轻松IAP
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT系列ROM中的FlexSPI驱动API实现IAP. 痞子衡的技术交流群里经常有群友提问: i.MXRT中的FlexSPI驱动 ...
随机推荐
- C. Bank Hacking 解析(思維)
Codeforce 796 C. Bank Hacking 解析(思維) 今天我們來看看CF796C 題目連結 題目 略,請直接看原題. 前言 @copyright petjelinux 版權所有 觀 ...
- 机器学习 第4篇:sklearn 最邻近算法概述
sklearn.neighbors 提供了针对无监督和受监督的基于邻居的学习方法的功能.监督的基于最邻近的机器学习算法是值:对带标签的数据的分类和对连续数据的预测(回归). 无监督的最近算法是许多其他 ...
- 【新阁教育】基于ModbusTCP实现西门子1200PLC定位控制案例
1. 引言 今天新阁教育给大家分享一个<基于ModbusTCP实现西门子1200PLC定位控制案例>,从PLC输入输出及步进电机接线开始,到PLC运动控制程序编写,再到后续的ModbusT ...
- 云服务器部署scrapyd爬虫
Scrapyd部署爬虫项目 GitHub:https://github.com/scrapy/scrapyd API 文档:http://scrapyd.readthedocs.io/en/stabl ...
- ZOJ 1006 Do the Untwish
Do the Untwish 题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1006 题意:给定密文按公式解密 注 ...
- 快进来!花几分钟看一下 ReentrantReadWriteLock 的原理!
前言 在看完 ReentrantLock 之后,在高并发场景下 ReentrantLock 已经足够使用,但是因为 ReentrantLock 是独占锁,同时只有一个线程可以获取该锁,而很多应用场景都 ...
- vue实现带logo的二维码/商品条形码/打印商品吊牌
一.带logo的二维码 1.安装 npm install vue-qr --save 2.在页面或组件中使用 <template> <div id="qrcode" ...
- HTML图片点击放大---关闭
<html lang="en"> <head> <meta charset="UTF-8"> </head> & ...
- Assert类的静态方法
五:常用断言 在NUnit中,断言是单元测试的核心.NUnit提供了一组丰富的断言,这些断言是Assert类的静态方法.如果一个断言失败,方法的调用不会返回值,并且会报告一个错误.如果一个测试包含多个 ...
- java.sql.SQLException: Error: Error: could not match input
impala执行sql,输出后我在控制台粘贴执行OK,奇怪了. java.sql.SQLException: Error: Error: could not match input 原因竟然是myba ...