我需要使用CRC进行代码验证。在这种情况下,我所做的就是通过算法传递每个字节找到的闪存,以计算CRC并将结果与预定义的CRC值进行比较。
但是,我很想知道闪存可能会在某些时候发生变化,导致CRC验证失败。
假设没有再次触摸代码,闪存是否可能在执行期间发生变化?如果是这样,是什么导致它改变?我该如何避免这种改变?
答案 0 :(得分:0)
闪存仅意味着它在没有电源的情况下保留其内容;闪存绝对是可擦除/可重新编程的。单独的术语只读存储器(ROM)意味着在初始写入后不能更改它。
但是,除非CPU指令触及或降低或受外部因素影响,否则内存不会发生变化。闪存内容可能会持续十年不受干扰。通常是在年龄之前降低闪存的读/写周期数。高静电电荷可能会破坏闪光,但磁场的影响不大。
如果您对硬件规格有任何影响,如果这是主要意图,则应考虑ROM;为此目的,它有超过闪存的几个优点。
最后,您注意到您将通过CRC算法传递“每个字节”的内存。如果要将正确的校验和存储在同一存储介质中,则会出现递归问题,即尝试预先计算包含其自身校验和的校验和。在大多数情况下,有效校验和应位于内存的某些段中,而这段内容本身不受扫描。
答案 1 :(得分:0)
在任何情况下,如果 自发地更改,这正是您的代码验证要捕获的内容,并且您希望并期望CRC失败,那么没有问题 - 它正在做它的工作
这主要不是自发改变的问题,而是在第一种情况下没有正确写入,或者可能防止恶意或意外篡改。如果部分闪存用于可变非易失性存储,您显然不会在CRC中包含该区域。如果您 将相同的闪存划分为代码空间和NV存储,NV存储代码中的潜在错误可能会无意中修改代码空间,因此您的CRC可以防止这种情况以及外部篡改(例如通过JTAG) )。
闪存具有擦除/写入周期耐久性,并且在多个周期之后,某些位可能会“高”。部件之间的耐久性从大约10000到100000不等,并且很少是代码存储的问题。闪存还具有标称数据保留时间;这通常是10年的报价;但这是最坏情况的极端条件评级 - 再次你的CRC防止这些影响。