加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
    • 一、ielftool 命令行工具
    • 二、为工程添加 CRC 校验
    • 三、在工程中验证 CRC 校验
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

在IAR下如何为工程开启CRC完整性校验功能?

2020/12/03
857
阅读需 12 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是在 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 SystemsEmbedded Workbench 8.50.6armdocEWARM_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-K64Fboardsfrdmk64fdemo_appshello_worldiar,在工程选项 Linker/Checksum 下面,勾选 Fill unused code memory 和 Generate checksum 便使能了 CRC 校验,蓝色框里的两个地址用于设置 CRC 计算范围,绿框里的参数用于设置 CRC 算法细节,具体每个配置什么意义可以查看 IAR SystemsEmbedded Workbench 8.50.6armdocEWARM_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$binielftool --fill="0xFF;__checksum_begin-__checksum_end" --checksum="__checksum:4,crc32:p,0xffffffff;__checksum_begin-__checksum_end" --verbose "$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 完整性校验功能的方法痞子衡便介绍完毕了,掌声在哪里~~~

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
EPCQ4ASI8N 1 Intel Corporation Memory Circuit, 512KX8, CMOS, PDSO8, SOIC-8

ECAD模型

下载ECAD模型
$17.62 查看
DSC1001CI5-015.0000T 1 Microchip Technology Inc CMOS Output Clock Oscillator
暂无数据 查看
HCPL-316J-500E 1 Agilent Technologies Inc IC Output Optocoupler, 1-Element, 3750V Isolation,
$26.26 查看

相关推荐

电子产业图谱

硕士毕业于苏州大学电子信息学院,目前就职于恩智浦(NXP)半导体MCU系统部门,担任嵌入式系统应用工程师。痞子衡会定期分享嵌入式相关文章