如何在 IAR KEIL 中计算 CRC
前言
市面上越来越多的产品对其使用提出了安全要求,如何避免使用过程中对操作者带来危险,或者降低这种危险发生的概率,
这都是产品安全性需要考虑的。鉴于此,相关产品需要通过相关行业的安全认证才能生产上市。针对 CLASSB 以及 SIL
证,ST 分别提供了对应的软件库以及应用手册来帮助客户开发有安全认证需求的产品。
我们在支持客户的过程中,发现客户经常在 Flash 校验这一块碰到问题。这里整理了遇到的常见问题,并基于 IARKEIL
两种 IDE 介绍如何配置 FLASH CRC 计算的方法。
Flash 自检的流程
Flash 的自检一般分为启动时自检和程序运行时自检两个阶段。不管是哪种自检,其思路都是:
在程序编译完成后,计算整个程序的 CRC 值,然后将这个 CRC 值添加到可执行文件末尾。再将带有 CRC 校验值的可执行文
件烧录到 MCU 中。在程序启动后,由程序中的自检代码重新再根据当前 Flash 内容(不包括预存的 CRC 校验值)计算一次
CRC 值,再与之前预先计算并烧录到 Flash 中的 CRC 校验值进行比较,如果一致就通过检测。
这两个自检阶段的区别就是:
程序启动自检是一次性对整个实际 Flash 代码范围计算出最终的 CRC 值;而运行时的自检,为了不影响其他程序模块的运
行,计算 CRC 的过程是分步进行的,每次计算一部分,分多次计算出最终的 CRC 值。
围绕 Flash 的自检所发生的问题可以归为两大类,一类是预先计算 CRC 值时和上电后计算 CRC 值的 Flash 范围设置是否一
致;第二类就是预先计算 CRC 时和上电后计算 CRC 采用的 CRC 算法是否一致。
如何添加 CRC
下面我们主要介绍如何添加 CRC 校验值到可执行文件。
基于 IAR 环境
如果你使用 IAR IDE,那么添加 CRC 值的配置相对比较简单。通过配置 IAR CRC 计算参数,自动对整个 FLASH 空间
CRC 计算,并将计算结果放到 FLASH 的末尾。
1. 修改 Link 文件,指定 CRC 值的存放位置
Link 文件中增加下面语句,指定 checksum FLASH 中的存储位置。
place at end of ROM_region { ro section .checksum };
该语句指定将 CRC 的值放在 FLASH 的末尾位置。是整个 FLASH 空间的末尾,不是应用程序的代码末尾。这样,CRC 值的
位置就是固定的。不会随代码大小而变化。
在自检代码中,可以通过__checksum 读取 Flash 中保存的 CRC 校验值来与重新计算的 CRC 值进行比较。
2.配置 Checksum 页面的参数
link 文件中指定了 checksum 的存储位置后,还要在工程配置菜单中,配置计算 CRC 值的范围和参数。见下图:
IAR checksum 页面分为两个部分。
第一部分,也就是红线圈出的部分。定义了 FLASH 中需要计算 CRC 的范围和空闲字节填充值。这里注意要留出 flash 末尾存
CRC 值的位置。
剩下的部分,就是对 checksum 计算参数的设定部分。
Checksum size :选择 checksum 的大小(字节数)
Alignment指定 checksum 的对齐方式。一般,处理器不支持非对齐访问时有用,不填的话默认 1 字节对齐。
Algorithm:选择 checksum 的算法
Complement:是否需要进行补码计算。选择“As is”就是不进行补码计算。
Bit order:位输出的顺序。MSB first,每个字节的高位在前。LSB first,每个字节的低位在前。
Reverse byte order within word 对于输入数据,在一个字内反转各个字节的顺序。
Initial value checksum 计算的初始化值