嵌入式MCU存储器ECC工作原理


嵌入式MCU存储器ECC工作原理

注:摘自汽车电子 expert 成长之路公众号

来简单聊一聊ECC,ECC 是“Error Correcting Code”的简写,中文名称是“错误检查和纠正”。ECC 是一种能够实现“错误检查和纠正”的技术。

1、奇偶校验技术
要了解 ECC 技术,就不能不提到 Parity(奇偶校验)。在 ECC 技术出现之前,内存中应用最多的是另外一种技术,就是 Parity(奇偶校验)。我们知道,在数字电路中,最小的数据单位就是叫“比特(bit)”,也叫数据“位”,“比特”也是内存中的最小单位,它是通过“1”和“0”表示数据高、低电平信号的。在数字电路中 8 个连续的比特是一个字节(byte),在内存中不带“奇偶校验”的内存中的每个字节只有 8 位,若它的某一位存储出了错误,就会使其中存储的相应数据发生改变而导致应用程序发生错误。而带有“奇偶校验”的内存在每一字节(8位)外又额外增加了一位用来进行错误检测。比如一个字节中存储了某一数值(1、0、1、0、1、0、1、1),把这每一位相加起来(1+0+1+0+1+0+1+1=5)。若其结果是奇数,对于偶校验,校验位就定义为 1,反之则为 0;对于奇校验,则相反。当 CPU 返回读取存储的数据时,它会再次相加前 8 位中存储的数据,计算结果是否与校验位相一致。当 CPU 发现二者不同时就会尝试纠正这些错误。但 Parity 的不足是:当内存查到某个数据位有错误时,却并不一定能确定在哪一个位,也就不一定能修正错误,所以带有奇偶校验的内存的主要功能仅仅是“发现错误”,并不能纠正部分简单的错误。

2、ECC 纠错与检错算法
通过上面的分析我们知道 Parity 内存是通过在原来数据位的基础上增加一个数据位来检查当前 8 位数据的正确性,但随着数据位的增加 Parity 用来检验的数据位也成倍增加,就是说当数据位为 16 位时它需要增加 2 位用于检查,当数据位为 32 位时则需增加 4 位,依此类推。特别是当数据量非常大时,数据出错的几率也就越大,对于只能纠正简单错误的奇偶检验的方法就显得力不从心了,正是基于这样一种情况,一种新的内存技术应运而生了,这就是 ECC(错误检查和纠正),这种技术也是在原来的数据位上外加校验位来实现的。不同的是两者增加的方法不一样,这也就导致了两者的主要功能不太一样。**它与 Parity 不同的是如果数据位是 8 位,则需要增加 5 位来进行 ECC 错误检查和纠正,数据位每增加一倍,ECC 只增加一位检验位,也就是说当数据位为 16 位时 ECC 位为 6 位,32 位时 ECC 位为 7位,数据位为 64 位时 ECC 位为 8 位,依此类推,数据位每增加一倍,ECC 位只增加一位。**总之,在内存中 ECC 能够容许错误,并可以将错误更正,使系统得以持续正常地操作,不致因错误而中断,且 ECC 具有比 Parity 更强大的自动识别、更正的能力,可以将 Parity 无法检查出来的错误位查出并将错误修正。

3、嵌入式 MCU 存储器 ECC 的实现原理与特点
基于 MCU 的嵌入式控制系统通常工作在电磁环境复杂的环境中,特别是汽车 ECU,为了保证其存储器中的数据和程序代码的完整性和可靠性,存储器的 ECC 技术被广泛使用在嵌入式 MCU 中。
其原理是在存储器硬件上,按照最小的 ECC 计算单元,使用额外的存储器来储存该存储器单元中数据的 ECC 计算结果。比如 32-bit 用户数据+ 7-bit ECC 结果存储器结构如下(其中 ECC 结果为作者随机填入的,并非真实计算的 ECC 结果):
在这里插入图片描述
向存储器中写入数据时,ECC 硬件模块会自动计算写入数据的 ECC 结果,然后写入到相应 ECC 储存单元中;在读取存储器数据时,ECC 硬件模块将该 EEC 储存单元的用户数据取出,进行相同的 ECC 计算得到储存数据的 ECC 结果,并于写入时产生的 ECC 结果做对比,从而发现比特翻转错误(检错)和纠正错误数据(纠错);
根据 ECC 算法的不同,其可以发现比特翻转的位数以及可以纠正的存储器比特位数量也不同,使用越复杂的 ECC 算法(需要更多的 ECC 计算结果储存位),其检错和纠错能力越强。当然实现所需的硬件电路也越加复杂,这将大大增加存储器硬件成本。

综上所述,嵌入式 MCU 存储器的 ECC 具有如下特点:

ECC 按照最小 ECC 计算单元进行组织,因此,即使仅写入一个字节,也将以这个储存单元的数据进行 ECC 计算并储存;所以按照存储器的 ECC 计算单元来写入存储器数据是最高效的;

? ECC 结果储存位不占用用户存储器地址空间,且其中的 ECC 结果对用户不可见(通过调
试器也无法读取,因为其未做存储器地址映射);

? 对 NVM(EEPROM 和 Flash)的 和 都将产生 ECC 结果并储存;

? 只有对存储器数据进行读取时,才检查 ECC,也就意味着,只有读取存储器时才会触发 ECC 错误,注意 NVM 的 Verify 也是一个读取储存器的过程,因此 verify 也会触发ECC 错误;

? 因为单比特翻转的概率远大于 2-比特和多比特翻转,而实现多比特纠错需要更佳复杂
的 ECC 算法和储存更多位的 ECC 计算结果,所以在嵌入式MCU中通常的存储器ECC都仅支持单比特纠错,多比特检错;