如何在 IAR 和 KEIL 中计算 CRC 值
前言
市面上越来越多的产品对其使用提出了安全要求,如何避免使用过程中对操作者带来危险,或者降低这种危险发生的概率,
这都是产品安全性需要考虑的。鉴于此,相关产品需要通过相关行业的安全认证才能生产上市。针对 CLASSB 以及 SIL 认
证,ST 分别提供了对应的软件库以及应用手册来帮助客户开发有安全认证需求的产品。
我们在支持客户的过程中,发现客户经常在 Flash 校验这一块碰到问题。这里整理了遇到的常见问题,并基于 IAR,KEIL 这
两种 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 值的范围和参数。见下图: