大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是在IAR开发环境下为工程开启CRC完整性校验功能的方法

  CRC校验在嵌入式领域里的应用非常广,比如在通信领域,CRC检验值可以作为数据包的一部分,用于检查一包数据传输过程中是否发生了比特错误,如果CRC校验失败,那么接收方可以通知发送方要求该包数据重新传输,这样能大大增加数据传输的可靠性。同时CRC在应用程序完整性验证方面也有广泛应用,相比和检验,CRC校验纠错能力更强;相比签名校验,CRC校验在速度方面又占优势,因此它是一个各方面比较均衡的完整性验证手段。

  IAR是个非常老牌的嵌入式开发集成环境,它的功能非常强大,有很多宝藏功能值得我们去发掘。痞子衡自毕业之后就一直在使用IAR,算是一路看着它从古典画风的v6.50.x升级到现在潮流的v8.50.x,对于经典的CRC校验功能的支持,IAR当然不会放过,今天痞子衡就来介绍IAR下如何使用其自带的CRC校验功能。

一、ielftool命令行工具

  IAR安装目录下有非常多的命令行小工具,这些小工具其实就是IAR的核心,集成开发环境界面只是提供人机交互,其背后的很多功能都是通过调用这些命令行小工具来实现的。其中用于实现CRC校验的功能就包含在ielftool.exe工具里:

  ielftool.exe工具跟CRC相关的一共两个参数选项,一是--fill用于填充,二是--checksum用于设置算法,具体参数使用细节详见 \IAR Systems\Embedded Workbench 8.50.6\arm\doc\EWARM_DevelopmentGuide.ENU手册里的Checksum calculation for verifying image integrity小节。

  此处痞子衡仅举一个简单例子,如下命令表示在源可执行文件sourceFile.out中计算范围__checksum_begin - __checksum_end之间的CRC结果,最终校验值__checksum长度为4字节、固定CRC32算法、计算单元为1字节、指定CRC初始值为0xffffffff,其余设置默认,并将结果放在目标可执行文件destinationFile.out中。

ielftool --fill="0xFF;__checksum_begin–__checksum_end"
--checksum="__checksum:4,crc32:p,0xffffffff;__checksum_begin-__checksum_end"
sourceFile.out
destinationFile.out

  从上面的命令你应该能知道,sourceFile.out并不是任意可执行文件都行的,其必须包含必要的__checksum_begin、__checksum_end、__checksum的定义。假设我们代码中并没有实际使用CRC,那么我们需要在生成sourceFile.out文件的IAR工程选项里做如下设置:

注意:__checksum_begin、__checksum_end符号、__checksum变量、.checksum段四个名字,用户都可以自定义的,这里命名成这样主要是为了和IAR默认定义相统一。

  让我们随便找一个嵌入式IAR工程按上面设置生成源hello_world.out文件,并使用ielftool工具执行一次命令看看,可以看到产生了__checksum值,新生成的hello_world_1.out文件里包含了正确的CRC校验结果。

二、为工程添加CRC校验

  IAR界面里有两种使用ielftool来生成CRC校验值的方法,痞子衡一一介绍:

2.1 利用Checksum功能

  第一种是直接在IDE界面里配置,我们随便打开一个嵌入式工程,比如 \SDK_2.8.2_FRDM-K64F\boards\frdmk64f\demo_apps\hello_world\iar\,在工程选项Linker/Checksum下面,勾选Fill unused code memory和Generate checksum便使能了CRC校验,蓝色框里的两个地址用于设置CRC计算范围,绿框里的参数用于设置CRC算法细节,具体每个配置什么意义可以查看 \IAR Systems\Embedded Workbench 8.50.6\arm\doc\EWARM_DevelopmentGuide.ENU手册里的Checksum一节,痞子衡在这里不予展开。

  下图示例配置中有两点要说明:一、算法选择了CRC32,其多项式系数其实固定为0x04C11BD7;如果想自定义CRC32多项式系数值,可选CRC polynomial;二、因为地址设置的是 0x0 - 0x400,一共1025个字节(包含0x400),所以checksum unit size此处仅能选8-bit,因为IDE强制要求地址对齐。

  设置好之后重新编译工程,此时会报错“ielftool error: The string '__checksum' was not found in the string table ”,因为在程序代码里,我们完全没有任何CRC相关的引用,IAR会忽略界面里使能的CRC功能,所以我们还需要将__checksum强行加入如下选项里(注意__checksum是IAR里默认定义的CRC检验值符号名)。

  这时候再编译工程就可以在生成的.out和.map文件里看到CRC信息了,__checksum被链接器随机放在了0x2844的位置,__checksum_begin和__checksum_end是IAR默认记录CRC计算范围的符号变量名。

  如果你想自己决定__checksum的链接位置,你可以在工程链接文件里添加放置 section .checksum,这个段便对应着__checksum。比如我们试着将这个段放在0x1000的位置:

  再一次编译工程,查看map文件,这次__checksum被放在了我们指定的0x1000的位置。

2.2 利用Post-build功能

  第二种方式是利用IDE里的Post-build功能,在第一节的基础上,在工程选项Linker/Extra Options里把ielftool命令加进去,这样在编译工程的时候,IAR会自动跑这个命令:

$TOOLKIT_DIR$\bin\ielftool --fill="0xFF;__checksum_begin-__checksum_end" --checksum="__checksum:4,crc32:p,0xffffffff;__checksum_begin-__checksum_end" --verbose "$TARGET_PATH$" "$TARGET_PATH$"

  上述命令与第一节中命令基本一致,只是用"$TARGET_PATH$" "$TARGET_PATH$"替代了sourceFile.out destinationFile.out,并且加了--verbose显示执行操作信息:

三、在工程中验证CRC校验

  IAR生成的CRC校验值在应用程序里的使用就比较简单了,见如下代码,其中calc_crc()函数需与我们之前在IAR配置的CRC算法参数相一致,此外代码中的数据类型也是与具体CRC配置有关的。

  另外还有两个注意点:一、CRC计算范围不应包含__checksum存放位置;二、CRC计算范围如果没有按照算法对齐要求,那么实际计算时要相应补上0(使用IDE配置生成是强制对齐的,但是使用命令行没有强制对齐)。

extern uint32_t const __checksum;
extern int32_t __checksum_begin;
extern int32_t __checksum_end; void TestChecksum()
{
uint32_t calc = 0; // 根据CRC计算范围重算新CRC校验值
calc = calc_crc(0xFFFFFFFF,
(uint8_t *) &__checksum_begin,
((uint8_t *) &__checksum_end - ((uint8_t *) &__checksum_begin) + 1)); // 比对新CRC校验值与IAR生成的CRC校验值
if (calc != __checksum)
{
printf("Incorrect checksum!\n");
}
}

  至此,在IAR开发环境下为工程开启CRC完整性校验功能的方法痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

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

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

痞子衡嵌入式:在IAR开发环境下为工程开启CRC完整性校验功能的方法的更多相关文章

  1. 痞子衡嵌入式:在IAR开发环境下RT-Thread工程函数重定向失效分析

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下RT-Thread工程函数重定向失效分析. 痞子衡旧文 <在IAR下将关键函数重定向到RAM中执行的方法> ...

  2. 痞子衡嵌入式:一次利用IAR自带CRC完整性校验功能的实践(为KBOOT加BCA)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是利用IAR自带CRC完整性校验功能的一次实践(为KBOOT加BCA). 痞子衡之前写过两篇关于IAR中自带CRC校验功能的文章 < ...

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

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

  4. 痞子衡嵌入式:在IAR开发环境下将关键函数重定向到RAM中执行的三种方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下将关键函数重定向到RAM中执行的三种方法. 嵌入式项目里应用程序代码正常是放在 Flash 中执行的,但有时候也需要将 ...

  5. 痞子衡嵌入式:在IAR开发环境下将整个源文件代码重定向到任意RAM中的方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下将整个源文件代码重定向到任意RAM中的方法. 痞子衡旧文 <在IAR下将关键函数重定向到RAM中执行的方法> ...

  6. 痞子衡嵌入式:IAR内部C-SPY调试组件配套宏文件(.mac)用法介绍

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR内部C-SPY调试组件配套宏文件(.mac)用法. 痞子衡之前写过一篇 <JLink Script文件基础及其在IAR下调用 ...

  7. 痞子衡嵌入式:IAR在线调试时设不同复位类型可能会导致i.MXRT下调试现象不一致(J-Link / CMSIS-DAP)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR在线调试时设不同复位类型可能会导致i.MXRT下调试现象不一致. 做Cortex-M内核MCU嵌入式软件开发,可用的集成开发环境( ...

  8. 痞子衡嵌入式:其实i.MXRT下改造FlexSPI driver同样支持AHB方式去写入NOR Flash

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT下改造FlexSPI driver以AHB方式去写入NOR Flash. 痞子衡前段时间写过一篇 <串行NAND Fl ...

  9. Myeclipse开发环境下文件中出现的提示错误与解决方法:The import javax.servlet cannot be resolved?

    1.开发工具:MyEclipse 2.右击项目  >>  Build Path  >>  Add External Archives (Tomcat  >>  li ...

随机推荐

  1. openspiel 随笔 05.05

    现阶段的任务是向openspiel 中添加e一个自己的游戏 上次已经将大体的逻辑写完了,但运行时出了问题.state 为空. Incorrect number of characters in str ...

  2. E. Tree Queries 解析(思維、LCA)

    Codeforce 1328 E. Tree Queries 解析(思維.LCA) 今天我們來看看CF1328E 題目連結 題目 給你一棵樹,並且給你\(m\le2e5\)個詢問(包含\(k\)個點) ...

  3. Luogu P2447 [SDOI2010]外星千足虫

    题意 给定 \(n\) 个变量和 \(m\) 个异或方程,求最少需要多少个才能确定每个变量的解. \(\texttt{Data Range:}1\leq n\leq 10^3,1\leq m\leq ...

  4. K8S的Kafka监控(Prometheus+Grafana)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  5. Java_面向对象三大特征

    面向对象特征 面向对象三大特征: 继承, 封装, 多态 继承 继承: 子类可以从父类继承属性和方法 对外公开某些属性和方法 要点(eclipse中Ctrl+T查看继承结构) 1.父类也称超类, 基类, ...

  6. php映射echarts柱状图

    多种样式柱状图 前台部分 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  7. 解决IE9弹出json下载提示框

    <!-- 开启注解 --> <mvc:annotation-driven> <mvc:message-converters> <bean class=&quo ...

  8. [MIT6.006] 22. Daynamic Programming IV: Guitar Fingering, Tetris, Super Mario Bro. 动态规划IV:吉他指弹,俄罗斯方块,超级玛丽奥

    之前我们讲到动态规划五步中有个Guessing猜,一般情况下猜有两种情况: 在猜和递归上:猜的是用于解决更大问题的子问题: 在子问题定义上:如果要猜更多,就要增加更多子问题. 下面我们来看如果像背包问 ...

  9. 应对告警风暴,Cloud Alert 实现告警风暴智能降噪

    前言 睿象云前段时间发表了一篇< Zabbix 实现电话.邮件.微信告警通知的实践分享>的技术文章.它帮助我们非常轻松地支持了各种告警通知方式,但是存在一个严重的问题,我们经常接到各种相类 ...

  10. MySQL架构(面)

    和其它数据库相比,MySQL有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用.主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离.这种架构可 ...