在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Micrium全家桶之uC-CRC: 0x02 CRC

嵌入式USB開發 ? 來源:嵌入式USB開發 ? 作者:嵌入式USB開發 ? 2023-06-08 11:00 ? 次閱讀

本文轉自公眾號,歡迎關注

Micrium全家桶之uC-CRC: 0x02 CRC (qq.com)

前言

前一篇我們講了Micrium全家桶之uC-CRC: 0x01 ECC:https://mp.weixin.qq.com/s/FKVvzwL7wzxLJCkx3gOdJQ。ECC常用于NAND進行誤碼校正。而CRC一般用于錯誤檢測,比如鏡像,協議的正確完備性檢測。

這一篇我們來講講uC-CRC組件的CRC部分,老規矩先代碼用起來,然后再講講原理,理論結合實踐。

使用

可以從https://github.com/qinyunti/uC-CRC.git下載代碼,該版本在原版本基礎上進行了修改,刪除了其他依賴,可以單獨使用,方便移植,也可以參考https://mp.weixin.qq.com/s/FKVvzwL7wzxLJCkx3gOdJQ。

有了上一篇基礎我們不再詳細介紹如何集成該代碼,直接進入測試環節。

文件

如果只使用CRC的話只需要crc_cfg.h和edc_crc.c,edc_crc.h即可。

配置

其中cec_cfg.h的宏EDC_CRC_CFG_OPTIMIZE_ASM_EN配置是否使用匯編代碼實現,默認為DEF_DISABLED.

以下宏配置是否使能對應的算法和反轉查找表

其中前面4個宏使能了4種算法,后面4個宏定義是否支持位反轉模式,如果是則會定義對應的CRC查找表,比如EDC_CRC_CFG_CRC32_REF_EN使能則使用CRC_TblCRC32_ref,EDC_CRC_CFG_CRC32_EN使能則使用CRC_TblCRC32。

所謂的位反轉就是bit7和bit0交換,bit6和bit1交換...,通過查表法空間換時間加快速度。有些場景需要位翻轉,所以有這個實現。

#define EDC_CRC_CFG_CRC16_1021_EN               DEF_ENABLED    /* See Note #3.                                         */


#define EDC_CRC_CFG_CRC16_8005_EN               DEF_ENABLED


#define EDC_CRC_CFG_CRC16_8048_EN               DEF_ENABLED


#define EDC_CRC_CFG_CRC32_EN                    DEF_ENABLED


#define EDC_CRC_CFG_CRC16_1021_REF_EN           DEF_ENABLED


#define EDC_CRC_CFG_CRC16_8005_REF_EN           DEF_ENABLED


#define EDC_CRC_CFG_CRC16_8048_REF_EN           DEF_ENABLED


#define EDC_CRC_CFG_CRC32_REF_EN                DEF_ENABLED

接口

CRC提供了以下接口

CRC_Open_16Bit


CRC_WrBlock_16Bit


CRC_WrOctet_16Bit


CRC_Close_16Bit


CRC_Open_32Bit


CRC_WrBlock_32Bit


CRC_WrOctet_32Bit


CRC_Close_32Bit

提供了兩組接口16位的和32位的

流式操作,結果存在結構體參數種 只支持查表法

CRC_Open_16Bit()->

CRC_WrBlock_16Bit()-> 一次寫多個字節

CRC_WrOctet_16Bit()-> 一次寫一個字節

CRC_Close_16Bit()->

32位的類似

CRC_Open_32Bit->

CRC_WrBlock_32Bit->

CRC_WrOctet_32Bit->

CRC_Close_32Bit->

這里提供這幾個位反轉接口,最后結果再調用這些接口進行位反轉。

CRC_Reflect_08Bit 查表法實現8位數據位反轉 查表是CRC_ReflectTbl

CRC_Reflect_16Bit 查表法實現16位數據位反轉

CRC_Reflect_32Bit 查表法實現32位數據位反轉

還提供兩個接口直接計算,立即返回計算值,支持查表和不查表

CRC_ChkSumCalc_16Bit

CRC_ChkSumCalc_32Bit

所以以上有幾種配置:使用查表還是不使用查表,使用位反轉還是不使用

p_model->Reflect == DEF_YES 則使用位反轉

p_model->TblPtr == (const CPU_INT16U *)0則不使用查表

測試

以CRC_ChkSumCalc_16Bit為例

CPU_INT16U   crc = CRC_ChkSumCalc_16Bit((CRC_MODEL_16*)&CRC_ModelCRC16_8005,(void*)p_datap,strlen(p_datap),&err);

第一個參數傳入默認配置好的

const CRC_MODEL_16  CRC_ModelCRC16_8005 = {


0x8005u,


0x0000u,


DEF_NO,


0x0000u,


&CRC_TblCRC16_8005[0]


};

即多項式為0x8005,初始值為0x0000,不進行位反轉,不進行異或輸出,查表為CRC_TblCRC16_8005。

測試代碼如下

#include < stdio.h >
#include < stdint.h >
#include "edc_crc.h"
uint8_t s_buffer[33];
int crc_main(int argc, char* argv[])
{
  const char* p_datap="123456789";
  EDC_ERR err;
  CPU_INT16U   crc = CRC_ChkSumCalc_16Bit((CRC_MODEL_16*)&CRC_ModelCRC16_8005,(void*)p_datap,strlen(p_datap),&err);
  if(EDC_CRC_ERR_NONE != err)
  {
    printf("err\\r\\n");
  }
  else
  {
    printf("crc = %#x\\r\\n",crc);
  }
  return 0;
}

打印值如下

crc = 0xfee8

和edc_crc.h下列舉的測試用例結果一致

*                       ------------------------------------------------------------------
*                       |    POLY    |  REFLECT?  |  INIT VAL  | COMP. OUT? |     CRC    |
*                       -------------+------------+------------+------------+-------------
*                       |     0x1021 |     NO     |     0x0000 |     NO     |     0x31C3 |
*                       |     0x1021 |     NO     |     0x0000 |     YES    |     0xCE3C |
*                       |     0x1021 |     NO     |     0x1D0F |     NO     |     0xE5CC |
*                       |     0x1021 |     NO     |     0xFFFF |     NO     |     0x29B1 |
*                       |     0x1021 |     NO     |     0xFFFF |     YES    |     0xD64E |
*                       -------------+------------+------------+------------+-------------
*                       |     0x1021 |     YES    |     0x0000 |     NO     |     0x2189 |
*                       |     0x1021 |     YES    |     0x0000 |     YES    |     0xDE76 |
*                       |     0x1021 |     YES    |     0xFFFF |     NO     |     0x6F91 |
*                       |     0x1021 |     YES    |     0xFFFF |     YES    |     0x906E |
*                       -------------+------------+------------+------------+-------------
*                       |     0x8005 |     NO     |     0x0000 |     NO     |     0xFEE8 |
*                       |     0x8005 |     NO     |     0x0000 |     YES    |     0x0117 |
*                       |     0x8005 |     NO     |     0xFFFF |     NO     |     0xAEE7 |
*                       |     0x8005 |     NO     |     0xFFFF |     YES    |     0x5118 |
*                       -------------+------------+------------+------------+-------------
*                       |     0x8005 |     YES    |     0x0000 |     NO     |     0xBB3D |
*                       |     0x8005 |     YES    |     0x0000 |     YES    |     0x44C2 |
*                       |     0x8005 |     YES    |     0xFFFF |     NO     |     0x4B37 |
*                       |     0x8005 |     YES    |     0xFFFF |     YES    |     0xB4C8 |
*                       -------------+------------+------------+------------+-------------
*                       |     0x8048 |     NO     |     0x0000 |     NO     |     0x80A0 |
*                       |     0x8048 |     NO     |     0x0000 |     YES    |     0x7F5F |
*                       |     0x8048 |     NO     |     0xFFFF |     NO     |     0xE8E0 |
*                       |     0x8048 |     NO     |     0xFFFF |     YES    |     0x171F |
*                       -------------+------------+------------+------------+-------------
*                       |     0x8048 |     YES    |     0x0000 |     NO     |     0x1506 |
*                       |     0x8048 |     YES    |     0x0000 |     YES    |     0xEAF9 |
*                       |     0x8048 |     YES    |     0xFFFF |     NO     |     0x1710 |
*                       |     0x8048 |     YES    |     0xFFFF |     YES    |     0xE8EF |
*                       -------------+------------+------------+------------+-------------
*                       | 0x04C11DB7 |     NO     | 0x00000000 |     NO     | 0x89A1897F |
*                       | 0x04C11DB7 |     NO     | 0x00000000 |     YES    | 0x765E7680 |
*                       | 0x04C11DB7 |     NO     | 0xFFFFFFFF |     NO     | 0x0376E6E7 |
*                       | 0x04C11DB7 |     NO     | 0xFFFFFFFF |     YES    | 0xFC891918 |
*                       -------------+------------+------------+------------+-------------
*                       | 0x04C11DB7 |     YES    | 0x00000000 |     NO     | 0x2DFD2D88 |
*                       | 0x04C11DB7 |     YES    | 0x00000000 |     YES    | 0xD202D277 |
*                       | 0x04C11DB7 |     YES    | 0xFFFFFFFF |     NO     | 0x340BC6D9 |
*                       | 0x04C11DB7 |     YES    | 0xFFFFFFFF |     YES    | 0xCBF43926 |
*                       -------------+------------+------------+------------+-------------

CRC原理

參考

https://www.iar.com/knowledge/support/technical-notes/general/checksum-generation/

https://ecomputernotes.com/computernetworkingnotes/communication-networks/cyclic-redundancy-check

CRC即Cyclic Redundancy Check循環冗余校驗碼,用來進行錯誤檢測,我們對數據進行CRC計算得到一個校驗碼,校驗碼和數據一起發送,接收時再對數據計算CRC和收到的校驗碼比對,如果校驗值一樣則認為數據正確。其根本原理還是奇偶校驗,只是可以認為是花式奇偶校驗,源數據反轉一個bit會對應到CRC值的1位變化,但是源數據多位改變則有可能CRC不變。

所以CRC的校驗能力并不是很強,但是比奇偶校驗和求和校驗強,且好在簡單計算快,所以以太網等數據傳輸,一些傳感器數據,底層總線信號包等都使用CRC校驗。

從另一個角度CRC是基于二進制除法(MODULO ARITHMETIC)的算法,要傳輸的數據單元被一個預定的除數(二進制數)除以得到余數。這個余數稱為CRC。CRC比除數小1位。這意味著如果CRC為n位,則除數為n+ 1位。發送方將這個CRC附加到數據單元的末尾,這樣得到的數據單元就可以被預定的除數完全整除,即余數變為零。在目的地,輸入的數據單元(即數據+ CRC)被相同的數字(預定的二進制除數)所除,如果能整除就說明數據正確。

圖片

過程如下

先選擇除數(即二進制值),即對應的我們所說的多項式,比如選1011則對應多項式x^3+X^1+x^0,位數為4.

然后在源數據的后面添上4-1個0.比如源數據是1001則變為了1001000,然后這個值除以1011

注意這里除法有一點不一樣,看最左邊的一位如果余數最左邊是0則商0,否則商1,另外做減法時不需要借位,只需要滿足0-1=1 0-0=0 1-1=0 1-0=1

圖片

以上運算最終得到余數110所以,所以接到數據后就是1001110

接收端檢測時用1001110除以1011,如果余數為0說明數據正確

圖片

總結一下

l除數(多項式的位數)是CRC值的位數+1,比如對于8位CRC,其多項式的最高位為X^8,包括常數項就是9位。

lCRC可以檢測到所有影響奇數位的突發錯誤,偶數位不保證

l選擇的多項式決定了檢測錯誤的能力和類型,所以才有了那些標準的多項式

比如

圖片

除數和多項式的關系如下,最高次項始終是1,次數和CRC位數一樣.

圖片

用多項式的角度看除法就是如下圖,注意減法時不需要借位,系數滿足1bit的減法。

圖片

而CRC的計算一般都采用了查表法。

CRC計算工具

https://crccalc.com/?crc=01020304&method=crc32&datatype=hex

http://www.sunshine2k.de/coding/javascript/crc/crc_js.html

https://www.lammertbies.nl/comm/info/crc-calculation.html

總結

以上進行了uC-CRC的CRC部分測試以及相應的原理講解,在理解的基礎上可以將代碼集成到自己的項目中使用。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5082

    文章

    19123

    瀏覽量

    305151
  • NAND
    +關注

    關注

    16

    文章

    1682

    瀏覽量

    136155
  • crc
    crc
    +關注

    關注

    0

    文章

    199

    瀏覽量

    29465
  • Micrium
    +關注

    關注

    1

    文章

    7

    瀏覽量

    11759
收藏 人收藏

    評論

    相關推薦

    Micrium全家uC-FS: 0x02 NAND FTL算法原理詳解

    uC-FS的NAND驅動實現基于一篇論文:《KAST: K-Associative Sector Translation for NAND Flash Memory in Real-Time Systems》所以有必要先介紹下該論文的內容,以便后面理解代碼的實現。
    的頭像 發表于 06-08 10:55 ?1623次閱讀
    <b class='flag-5'>Micrium</b><b class='flag-5'>全家</b><b class='flag-5'>桶</b><b class='flag-5'>之</b><b class='flag-5'>uC</b>-FS: <b class='flag-5'>0x02</b> NAND FTL算法原理詳解

    Micrium全家uC-FS: 0x01 NAND FTL

    這一篇我們來講講Micrium全家uC-FS。文件系統是一個比較龐大的組件,我們以從下往上的順序介紹,即先以一個具體的設備:NAND為例,講其FTL的原理和實現,然后再講FS部分。
    的頭像 發表于 06-08 10:58 ?1871次閱讀
    <b class='flag-5'>Micrium</b><b class='flag-5'>全家</b><b class='flag-5'>桶</b><b class='flag-5'>之</b><b class='flag-5'>uC</b>-FS: <b class='flag-5'>0x</b>01 NAND FTL

    Micrium全家uC-CRC: 0x01 ECC

    我們這一篇來講講Micrium全家uC-CRC。該代碼庫提供了CRC算法進行錯誤檢測EDC,使用HAMMING算法實現ECC錯誤糾正。E
    的頭像 發表于 06-08 11:04 ?1200次閱讀
    <b class='flag-5'>Micrium</b><b class='flag-5'>全家</b><b class='flag-5'>桶</b><b class='flag-5'>之</b><b class='flag-5'>uC-CRC</b>: <b class='flag-5'>0x</b>01 ECC

    STM32的CRC外設如何設置

    本文中將介紹的就是如何配置IAR的CRC參數,使與STM32的CRC硬件模塊保持一致。本文中的例子都基于STM32F072進行。
    的頭像 發表于 09-28 06:05 ?1.7w次閱讀

    CRC的LSB表示方式該如何計算?

    的結果是011000111B=0xC7,都和格西CRC計算器結果0x02不一致。那么到底在對LSB表示的CRC該如何計算?還是說我的計算過程有問題?
    發表于 03-05 11:34

    CRC的LSB表示方式該如何計算?

    的結果是011000111B=0xC7,都和格西CRC計算器結果0x02不一致。那么到底在對LSB表示的CRC該如何計算?還是說我的計算過程有問題?
    發表于 03-05 13:59

    從M24SR通過i2c發送和接收字節時無法計算CRC

    命令來讀取CC文件長度,我將如何計算CRC?起始位0xAC 0x02 0x00 0xB0 0x0
    發表于 07-17 08:15

    CRC校驗源碼分析

    CRC根據權(即多項表達式)的不同而相應的源代碼也有稍許不同。以下是各種常用的權: CRA8 =X8+X5+X4+1 CRC-CCITT =X16+X12+X5+1
    發表于 04-07 20:49 ?117次下載

    STM32軟件CRC和硬件CRC速度測試

    軟件提前生成CRC表,用于查詢。分別使用軟件CRC算法和硬件CRC外設對一個緩存進行計算,目的是從該緩存中找到同步頭。同步頭共11字節,前兩個字節為后九個字節的CRC校驗值。通過迭代算
    發表于 05-09 11:45 ?6421次閱讀
    STM32<b class='flag-5'>之</b>軟件<b class='flag-5'>CRC</b>和硬件<b class='flag-5'>CRC</b>速度測試

    CRC算法原理和CRC編碼的實現方式與使用Verilog對CRC編碼進行描述

    CRC 校驗是一種在數據通信系統和其它串行傳輸系統中廣泛使用的錯誤檢測手段。通用的CRC 標準有CRC-8、CRC-16、CRC-32、
    發表于 08-06 16:39 ?36次下載
    <b class='flag-5'>CRC</b>算法原理和<b class='flag-5'>CRC</b>編碼的實現方式與使用Verilog對<b class='flag-5'>CRC</b>編碼進行描述

    CRC校驗 、STM32中CRC計算單元、 CRC應用

    CRC校驗、STM32中CRC計算單元、CRC應用
    的頭像 發表于 03-04 13:54 ?6108次閱讀

    用于單片機的CRC數據校驗方法

    方法也夠用了。二、代碼實現1.CRC表格crc table:static const u16 ccitt_table[256] = { 0x0000, 0x1021,
    發表于 12-17 18:35 ?3次下載
    用于單片機的<b class='flag-5'>CRC</b>數據校驗方法

    FPGA學習CRC校驗

    其中有的CRC寄存器初始值設置為全1,如以太網的CRC32,目的就是為了能檢測出數據前面的0的個數。1234算出來的CRC,跟01234算出來的,不一樣,這就能應對前面帶
    發表于 08-26 14:11 ?2366次閱讀

    講講Micrium全家uC-CRC算法

    我們這一篇來講講Micrium全家uC-CRC。該代碼庫提供了CRC算法進行錯誤檢測EDC,使用HAMMING算法實現ECC錯誤糾正。
    的頭像 發表于 05-04 10:47 ?856次閱讀
    講講<b class='flag-5'>Micrium</b><b class='flag-5'>全家</b><b class='flag-5'>桶</b>的<b class='flag-5'>uC-CRC</b>算法

    這個CRC計算單元是如何基于固定的生成多項式(0x4C11DB7)來獲取給定數據緩沖區的CRC碼的?

    這個CRC計算單元是如何基于固定的生成多項式(0x4C11DB7)來獲取給定數據緩沖區的CRC碼的?
    的頭像 發表于 05-16 16:06 ?856次閱讀
    主站蜘蛛池模板: 黄色日批网站| 干美女在线视频| 97成人在线视频| 超级香蕉97视频在线观看一区| 中国人69xxx大全| 一级特黄特黄的大片免费| 午夜影院操| 女人张开腿双腿让男人桶| 羞羞影院男女午夜爽爽影视| 免费在线看视频| 四虎成人免费网站在线| 成人在线91| 色爱综合区五月小说| 天堂网2021天堂手机版丶| 成人ww| 性欧美激情在线观看| 四虎影像| 午夜国产精品免费观看| a4yy私人毛片在线| 精品国产中文一级毛片在线看| 婷婷综合久久中文字幕| 成人亚洲欧美| 免费观看视频在线观看| 日日噜噜夜夜狠狠久久丁香| 狠狠尻| 99精品偷自拍| 四虎影院官网| 夜夜爽66| 欧美性xxxx交| 亚洲成人在线网站| 综合视频网| 亚洲视频一区二区在线观看| 农村妇女色又黄一级毛片卡| 免费观看一级特黄三大片视频| 在线天堂网| 老司机成人精品视频lsj| 午夜毛片不卡高清免费| 久久99热精品免费观看无卡顿| 国模最新私拍视频在线观看| 久久天天躁夜夜躁狠狠躁2015 | 亚洲伊人久久网|