我正在研究在微控制器上运行的程序,需要实现程序代码完整性的自检。
为此,我让代码在整个闪存(程序空间)上计算CRC16校验和,并通过某个网络将该值传输到另一个系统。然后,另一个系统必须将校验和与预先计算的值进行比较。
但是,每次更新时,CRC值都会更改。因此,如果程序代码可以事先准备好,那么整个过程可以简化,这样CRC16校验和总是匹配像0或更好的预定义值,如0x1234。
有没有简单的方法来实现这一目标?
另一种方法是:我可以轻松计算一个字节序列,我必须添加到我的程序二进制代码中(例如通过更改包含在程序中的虚拟数据的静态数组),以便CRC16给出我的预定值? 这个字节序列可以包含在代码中的任何地方,还是必须完全在最后?
(如果有必要,除了CRC-16之外,我还可以实现另一种校验和算法。)
感谢您的回答!
答案 0 :(得分:2)
是的,很容易。对于 n 字节的闪存,计算第一个 n-2 字节的CRC-16,并将该CRC存储在最后两个字节中。对于反射的CRC,这两个字节将以小端顺序附加,对于非反射的CRC,将以粗端顺序附加。那么 n 字节的CRC-16将是一个常量。该常数被称为CRC的“残留物”。对于没有排他性或最终的CRC,残留总是为零。您没有说明您正在使用的CRC,但您可以在Greg Cook's catalog中找到已知CRC的残留(在最终异或之前)。或者你可以看到你得到的东西。