风暴之眸 发表于 2025-10-11 18:44

奇偶校验算法实现一则

奇偶校验算法(Parity Check Algorithm)是一种简单的错误检测方法,用于验证数据传输中是否发生了位错误。通过在数据中添加一个附加的奇偶位(即校验位),来实现错误的检测和纠正。

在奇偶校验算法中,假设每个字节由8个比特(位)组成。奇偶校验位的值取决于数据字节中的1的个数。如果数据字节中1的个数是偶数个,奇偶校验位被设置为0;如果1的个数是奇数个,奇偶校验位被设置为1。这样,在接收端,通过统计接收到的数据字节中1的个数,就可以检测出位错误。


原理比较简单,我们再来看看在MCU中如何实现?我们设计以下应用场景,使用偶校验来验证保存在内存中一个word长度的数值,其最高为偶校验位,剩余31bit为有效位为例。C代码如下:
/**
* @brief:even check for uint32_t
*
* @param:
* @return: 0= pass; 1= failed;
* @note:
*/
int even_check(uint32_t dat)
{
    uint8_t i;
    uint8_t cnt = 0;
    for (i = 0; i < 32; i++)
    {
      if ((dat & 0x01) == 0x01)
      {
            cnt++;
      }
      dat = dat >> 1;
    }
    return (cnt & 0x01);
}

void even_ck_gen(uint32_t *buf)
{
    uint8_t i;
    uint8_t cnt = 0;
    uint32_t dat;
    *buf &= ~(0x80000000);
    dat = *buf;
    printf("dat = 0x%08X\r\n", dat);
    for (i = 0; i < 31; i++)
    {
      if ((dat & 0x01) == 0x01)
      {
            cnt++;
            printf("cnt = %d, dat= %08X\r\n", cnt, dat);
      }
      dat = dat >> 1;
    }
    if ((cnt & 0x01) == 0x01)
    {
      *buf |= 0x80000000;
    }
}在没有ECC这样外置校验位的情况下,通过bit32来代表奇偶校验位,虽然舍弃了一位,但可以实现数据的自校验,带来一定的可靠性。在数据量不需要32bit长度时,可以采用此方法。



阳光爆裂 发表于 2025-10-12 09:28

楼主 这是自己做了一个ECC校验位吗?!

风暴之眸 发表于 2025-10-13 11:01

阳光爆裂 发表于 2025-10-12 09:28
楼主 这是自己做了一个ECC校验位吗?!

确实是看了ECC的工作原理后,想到了这个事情。

心跳回响 发表于 2025-10-13 16:07

也是,也可以防止可重入数据的写入导致的问题。

天鹅绒之夜 发表于 2025-10-14 10:51

这个办法挺好的。可以校验word长度的数据完整性

黎明热忱 发表于 2025-10-14 19:03

学习了。
谢谢楼主分享

幻影书记 发表于 2025-10-14 19:24

这个还能这么用啊!
话说人家ECC不是使用奇偶校验算法吧

雾里闲逛 发表于 2025-10-15 10:08

ECC是带有纠错功能。
不过,如果现场应用不是恶劣的话,单检测应该也是可以的吧

jobszheng 发表于 2025-10-17 15:11

这个还是挺实用的。
另找一块内存区域与数据区域进行映射也可以的。
不必使用bit31

发光的梦 发表于 2025-10-19 23:08

不用把事情搞得这么复杂。
一般的应用MCU不会出现异常,而环境复杂的应用里面,直接上带硬件ECC的SRAM芯片即可

水之呢喃 发表于 2025-10-21 19:46

对word进行校验的方法。
谢谢楼主分享
页: [1]
查看完整版本: 奇偶校验算法实现一则