2016-11-23 103 views
0

我需要使用CRC进行代码验证。在这种情况下,我所做的就是通过算法传递每个找到的闪存字节,以计算CRC并将结果与​​预定义的CRC值进行比较。闪存是否在执行时改变?

但是,我想到闪存在某些时候可能会改变,导致CRC验证失败。

假设代码没有再次被触摸,闪存在执行过程中是否会改变?如果是这样,什么可能导致它改变?我如何避免这种变化?

+0

你不会说它是NAND还是NOR闪存。 NOR闪存的主要故障模式是单元无法擦除或无法写入。只要只读取NOR闪存中的数据,它应该在一段时间内保持不变。检查您的数据表以了解保留时间。除了写入和擦除失败之外,NAND闪存还会受到读取干扰。也就是说,读取单元格可能会导致其他附近单元格的更改。正确使用NAND闪存需要ECC。 – Sean

+0

添加CRC的全部意义在于检测闪存何时损坏。 CRC是首选算法,因为它擅长检测校验和本身以及数据中的错误。使用足够大的多项式,您将检测所有单比特错误和大多数多比特错误。 – Lundin

回答

0

闪存仅意味着它在没有电源的情况下保留其内容;闪存绝对是可擦除/可重新编程的。单独的只读存储器(ROM)表示在初始写入后它不能被修改。

但内存不会改变,除非CPU指令触及它或降级或受外部因素影响。闪存内容可能会持续十年不受干扰。通常是在年龄之前降级闪存的读/写周期数。高静电可能会损坏闪光灯,但磁场应该几乎没有影响。

如果您对硬件规格有任何影响,则应考虑ROM,如果这是主要意图;与此相比,它有几个优点。

最后,您注意到您将通过您的CRC算法传递“内存中的每个字节”。如果将正确的校验和存储在相同的存储介质中,则会出现递归问题,试图预先计算包含它自己的校验和的校验和。在大多数情况下,有效校验和应该位于内存本身不受扫描的某个段中。

+0

感谢您的回答!你是对的,我甚至没有想到这一点。如果我试图预先定义正确的校验和,它会被存储在闪存中,对吗?这会改变在运行时完成的校验和.- – RCRod21

+0

@ RCRod21不客气,请记住在有机会时接受答案。 –

+0

如果您的产品寿命长于数据保留规格,那么闪存在某些时候会始终失败。 – Lundin

0

在任何情况下,如果它自发地改变,这正是你的代码验证的目的是赶上,你想和期望CRC失败,所以没有问题 - 它做它的工作

它主要不是自发改变的问题,而是一种情况,一种情况是没有正确书写,或者可能防止恶意或意外篡改。如果部分闪存用于可变非易失性存储器,则显然不会在CRC中包含该区域。如果您的将同一闪存分区到代码空间和NV存储器中,则NV存储代码中的潜在错误可能会无意中修改代码空间,因此您的CRC可以防止这种情况发生,还可以防止外部篡改(例如,通过JTAG)。闪存要经受擦写周期的耐力,经过多次循环后,某些位可能会“高”。持续时间在10000到100000之间的部分之间变化,并且很少是代码存储的问题。闪存还具有标称的数据保留时间;这通常是10年的报价;但那是最糟糕的极端情况评级 - 您的CRC再次警惕这些影响。

相关问题