痞子衡嵌入式:在IAR开发环境下为工程开启CRC完整性校验功能的方法
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是在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完整性校验功能的方法的更多相关文章
- 痞子衡嵌入式:在IAR开发环境下RT-Thread工程函数重定向失效分析
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下RT-Thread工程函数重定向失效分析. 痞子衡旧文 <在IAR下将关键函数重定向到RAM中执行的方法> ...
- 痞子衡嵌入式:一次利用IAR自带CRC完整性校验功能的实践(为KBOOT加BCA)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是利用IAR自带CRC完整性校验功能的一次实践(为KBOOT加BCA). 痞子衡之前写过两篇关于IAR中自带CRC校验功能的文章 < ...
- 痞子衡嵌入式:探析开启CRC完整性校验的IAR工程生成.out和.bin文件先后顺序
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是开启CRC完整性校验的IAR工程生成.out和.bin文件先后顺序问题. 痞子衡之前写了一篇 <在IAR开发环境下为工程开启CRC ...
- 痞子衡嵌入式:在IAR开发环境下将关键函数重定向到RAM中执行的三种方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下将关键函数重定向到RAM中执行的三种方法. 嵌入式项目里应用程序代码正常是放在 Flash 中执行的,但有时候也需要将 ...
- 痞子衡嵌入式:在IAR开发环境下将整个源文件代码重定向到任意RAM中的方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下将整个源文件代码重定向到任意RAM中的方法. 痞子衡旧文 <在IAR下将关键函数重定向到RAM中执行的方法> ...
- 痞子衡嵌入式:IAR内部C-SPY调试组件配套宏文件(.mac)用法介绍
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR内部C-SPY调试组件配套宏文件(.mac)用法. 痞子衡之前写过一篇 <JLink Script文件基础及其在IAR下调用 ...
- 痞子衡嵌入式:IAR在线调试时设不同复位类型可能会导致i.MXRT下调试现象不一致(J-Link / CMSIS-DAP)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR在线调试时设不同复位类型可能会导致i.MXRT下调试现象不一致. 做Cortex-M内核MCU嵌入式软件开发,可用的集成开发环境( ...
- 痞子衡嵌入式:其实i.MXRT下改造FlexSPI driver同样支持AHB方式去写入NOR Flash
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT下改造FlexSPI driver以AHB方式去写入NOR Flash. 痞子衡前段时间写过一篇 <串行NAND Fl ...
- Myeclipse开发环境下文件中出现的提示错误与解决方法:The import javax.servlet cannot be resolved?
1.开发工具:MyEclipse 2.右击项目 >> Build Path >> Add External Archives (Tomcat >> li ...
随机推荐
- 通过Relect反射方法创建对象,获得对象的方法,输出对象信息
package reflects; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java. ...
- 你不知道的那些js调试命令
通常情况下,我们在调试js程序的时候一般都使用console.log()来进行程序的调试,打印自己所需要的内容什么的. 那么js的调试命令可不止一个console.log() 分类输出 console ...
- FastCGI协议分析
不知道什么时候,就开始有了让HomeServer支持PHP的念头.于是分析起了FastCGI协议.FastCGI用于WebServer与WebApplication之间的通讯,例如Apache与PHP ...
- K8S环境快速部署Kafka(K8S外部可访问)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- django 框架模型之models常用的Field
1. django 模型models 常用字段 1.models.AutoField 自增列 = int(11) 如果没有的话,默认会生成一个名称为 id 的列 如果要显式的自定义一 ...
- python中可迭代对象、迭代器、生成器
可迭代对象 关注公众号"轻松学编程"了解更多. 1.列表生成式 list = [result for x in range(m, n)] g1 = (i for i in rang ...
- 【Kata Daily 190927】Counting sheep...(数绵羊)
题目: Consider an array of sheep where some sheep may be missing from their place. We need a function ...
- 细学C++之C++语言的特点
优点: 1.强大的抽象封装能力:这让C++语言具备了强大的开发工程能力 2.高性能:运行快,并且占用资源少 3.低功耗:适合在各种微型的嵌入式设备中运行高效的程序 缺点: 1.语法相对复杂,细节比较多 ...
- spring处理静态资源方式
1. <mvc:default-servlet-handler/>default-servlet-handler在SpringMVC上下文定义一个org.springframework.w ...
- Jenkins - 部署在Tomcat容器里的Jenkins,提示“反向代理设置有误”
提示"反向代理设置有误"的背景 将jenkins.war放在tomcat容器中运行 访问Jenkins-系统管理,会提示"反向代理设置有误" 如何解决 在tom ...