[APM32F4] 奇偶校验算法实现一则

[复制链接]
456|21
风暴之眸 发表于 2025-10-11 18:44 | 显示全部楼层 |阅读模式
, ui, T3, DA, AMP, or
奇偶校验算法(Parity Check Algorithm)是一种简单的错误检测方法,用于验证数据传输中是否发生了位错误。通过在数据中添加一个附加的奇偶位(即校验位),来实现错误的检测和纠正。

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

奇偶校验01.png
原理比较简单,我们再来看看在MCU中如何实现?
我们设计以下应用场景,使用偶校验来验证保存在内存中一个word长度的数值,其最高为偶校验位,剩余31bit为有效位为例。C代码如下:

  1. /**
  2. * @brief:  even check for uint32_t
  3. *
  4. * @param:
  5. * @return: 0= pass; 1= failed;
  6. * @note:
  7. */
  8. int even_check(uint32_t dat)
  9. {
  10.     uint8_t i;
  11.     uint8_t cnt = 0;
  12.     for (i = 0; i < 32; i++)
  13.     {
  14.         if ((dat & 0x01) == 0x01)
  15.         {
  16.             cnt++;
  17.         }
  18.         dat = dat >> 1;
  19.     }
  20.     return (cnt & 0x01);
  21. }

  22. void even_ck_gen(uint32_t *buf)
  23. {
  24.     uint8_t i;
  25.     uint8_t cnt = 0;
  26.     uint32_t dat;
  27.     *buf &= ~(0x80000000);
  28.     dat = *buf;
  29.     printf("dat = 0x%08X\r\n", dat);
  30.     for (i = 0; i < 31; i++)
  31.     {
  32.         if ((dat & 0x01) == 0x01)
  33.         {
  34.             cnt++;
  35.             printf("cnt = %d, dat= %08X\r\n", cnt, dat);
  36.         }
  37.         dat = dat >> 1;
  38.     }
  39.     if ((cnt & 0x01) == 0x01)
  40.     {
  41.         *buf |= 0x80000000;
  42.     }
  43. }
在没有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进行校验的方法。
谢谢楼主分享
时光贩卖机 发表于 2025-10-29 13:31 | 显示全部楼层
代码示例很清晰,但我想知道在实际应用中,如何处理奇校验和偶校验的选择?
阳光爆裂 发表于 2025-10-29 10:54 | 显示全部楼层
居然这么多人回复。
感谢大家捧场了
和谐智者 发表于 2025-11-2 19:35 | 显示全部楼层
这个思路真棒。
sdlls 发表于 2025-11-5 09:45 | 显示全部楼层
奇校验:数据位与校验位中“1”的总数为奇数。若数据位中“1”的个数为偶数,则校验位置1;反之置0 。
偶校验:数据位与校验位中“1”的总数为偶数。若数据位中“1”的个数为奇数,则校验位置1;反之置0 。
mattlincoln 发表于 2025-11-5 11:15 | 显示全部楼层
奇偶校验的优势是实现简单、开销小
olivem55arlowe 发表于 2025-11-5 12:41 | 显示全部楼层
异或操作的特点是:相同为0,不同为1。连续异或可以统计出 1的个数是奇数还是偶数。
fengm 发表于 2025-11-5 15:14 | 显示全部楼层
只能检测奇数个比特的错误。这是最大的局限性。
biechedan 发表于 2025-11-5 17:09 | 显示全部楼层
检查接收到的数据是否满足奇偶校验规则
kkzz 发表于 2025-11-5 19:07 | 显示全部楼层
对于大量数据,可以考虑使用更高效的算法,如查表法或位操作优化。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

48

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部