Micrium全家桶之uC-CRC: 0x01 ECC (qq.com)
前言
我们这一篇来讲讲Micrium全家桶的uC-CRC。该代码库提供了CRC算法进行错误检测EDC,使用HAMMING算法实现ECC错误纠正。ECC算法在NAND的TFL中使用。
下载代码
git clone https://github.com/weston-embedded/uC-CRC.git
修改版本,去掉对uC-LIB,uC-CPU等的依赖,可以直接单独使用,方便移植。
https://github.com/qinyunti/uC-CRC.git
文件介绍
│ LICENSE
│ NOTICE
│ readme.md
│
├─Cfg
│ └─Template
│ crc_cfg.h
│
├─Ports
│ ├─ARM
│ │ └─IAR
│ │ ecc_hamming_a.asm
│ │ edc_crc_a.asm
│ │
│ └─ARM-Cortex-M3
│ └─IAR
│ ecc_hamming_a.asm
│ edc_crc_a.asm
│
└─Source
crc_util.c
crc_util.h
ecc.h
ecc_hamming.c
ecc_hamming.h
edc_crc.c
edc_crc.h
文件 | 说明 |
---|---|
LICENSE/NOTICE/readme.md | LICENSE使用的APACHE-2.0 |
crc_cfg.h | 配置文件 |
ecc_hamming_a.asm | 使用汇编实现Hamming_ParCalcBitWord_32默认提供了ARM和ARM-Cortex-M3架构IAR编译器的版本crc_cfg.h中#define EDC_CRC_CFG_OPTIMIZE_ASM_ENDEF_ENABLED时使用,默认不使 |
edc_crc_a.asm | 使用汇编实现CRC_ChkSumCalcTbl_16BitCRC_ChkSumCalcTbl_16Bit_refCRC_ChkSumCalcTbl_32BitCRC_ChkSumCalcTbl_32Bit_ref默认提供了ARM和ARM-Cortex-M3架构IAR编译器的版本crc_cfg.h中#define EDC_CRC_CFG_OPTIMIZE_ASM_ENDEF_ENABLED时使用,默认不使用 |
crc_util.c/h | 实现CRCUtil_PopCnt_32算法来自于http://en.wikipedia.org/wiki/Hamming_weight |
ecc_hamming.c/h | Ecc算法代码 |
edc_crc.c/h | Crc算法代码 |
添加代码到自己的工程
添加uC-CRC\\Cfg\\Template\\crc_cfg.h
uC-CRC\\Source下所有文件到自己的工程目录uC-CRC下
并配置头文件包含路径uC-CRC
依赖
文件 | 内容 |
---|---|
cpu.hcpu_core.hlib_def.hlib_mem.h | CPU_BOOLEANCPU_INT08UCPU_INT16UCPU_INT32UCPU_ADDRCPU_DATACPU_SIZE_TCPU_WORD_SIZE_32DEF_NODEF_YESDEF_DISABLEDDEF_ENABLEDDEF_INVALIDDEF_VALIDDEF_OCTET_NBR_BITSDEF_BITDEF_BIT_00~DEF_BIT_12DEF_BIT_13DEF_BIT_15DEF_BIT_17DEF_BIT_19DEF_BIT_21DEF_BIT_23DEF_BIT_25DEF_BIT_27DEF_BIT_29DEF_BIT_31DEF_BIT_SETDEF_BIT_IS_SETCPU_SW_EXCEPTIONMEM_VAL_COPY_GET_INT32UMEM_VAL_COPY_GET_INTUMEM_VAL_COPY_SET_INT32UMem_Clr |
修改代码
注释掉crc_util.h下的
#include < cpu.h >
#include < cpu_core.h >
改为
#include < crc_cfg.h >
注释掉ecc.h下的
#include < cpu.h >
#include < cpu_core.h >
注释掉ecc_hamming.h下的
#include < cpu.h >
#include < cpu_core.h >
#include < lib_def.h >
#include < lib_mem.h >
注释掉edc_crc.h下的
#include < cpu.h >
#include < cpu_core.h >
#include < lib_def.h >
注释掉
ecc_hamming.c下的
Mem_Clr((void *)p_ecc, HAMMING_LEN_OCTET_ECC); /* Init ECC buf for err(s) (see Note #6). */
改为
memset((void *)p_ecc, 0, HAMMING_LEN_OCTET_ECC);
前面添加
#include < string.h >
crc_cfg.h中实现以下依赖
/*
*********************************************************************************************************
* PORT
*
* Note(s) : (1) 以下添加依赖部分移植
*
*
*********************************************************************************************************
*/
/* ------------------ CPU WORD-ENDIAN ORDER ------------------- */
#define CPU_ENDIAN_TYPE_NONE 0u
#define CPU_ENDIAN_TYPE_BIG 1u /* Big- endian word order (see Note #1a). */
#define CPU_ENDIAN_TYPE_LITTLE 2u /* Little-endian word order (see Note #1b). */
#define CPU_CFG_ENDIAN_TYPE CPU_ENDIAN_TYPE_LITTLE
typedef unsigned char CPU_BOOLEAN; /* 8-bit boolean or logical */
typedef unsigned char CPU_INT08U; /* 8-bit unsigned integer */
typedef unsigned short CPU_INT16U; /* 16-bit unsigned integer */
typedef unsigned int CPU_INT32U; /* 32-bit unsigned integer */
typedef CPU_INT32U CPU_ADDR; /* CPU address type based on address bus size. */
typedef CPU_INT32U CPU_DATA; /* CPU data type based on data bus size. */
typedef CPU_ADDR CPU_SIZE_T; /* Defines CPU standard 'size_t' size. */
#define CPU_WORD_SIZE_32 4u /* 32-bit word size (in octets). */
/* ----------------- BOOLEAN DEFINES ------------------ */
#define DEF_NO 0u
#define DEF_YES 1u
#define DEF_DISABLED 0u
#define DEF_ENABLED 1u
#define DEF_INVALID 0u
#define DEF_VALID 1u
#define DEF_OCTET_NBR_BITS 8u
#define DEF_BIT(bit) (1uL < < (bit))
/* ------------------- BIT DEFINES -------------------- */
#define DEF_BIT_00 0x01u
#define DEF_BIT_01 0x02u
#define DEF_BIT_02 0x04u
#define DEF_BIT_03 0x08u
#define DEF_BIT_04 0x10u
#define DEF_BIT_05 0x20u
#define DEF_BIT_06 0x40u
#define DEF_BIT_07 0x80u
#define DEF_BIT_08 0x0100u
#define DEF_BIT_09 0x0200u
#define DEF_BIT_10 0x0400u
#define DEF_BIT_11 0x0800u
#define DEF_BIT_12 0x1000u
#define DEF_BIT_13 0x2000u
#define DEF_BIT_15 0x8000u
#define DEF_BIT_17 0x00020000u
#define DEF_BIT_19 0x00080000u
#define DEF_BIT_21 0x00200000u
#define DEF_BIT_23 0x00800000u
#define DEF_BIT_25 0x02000000u
#define DEF_BIT_27 0x08000000u
#define DEF_BIT_29 0x20000000u
#define DEF_BIT_31 0x80000000u
#define DEF_BIT_SET(val, mask) ((val) = ((val) | (mask)))
#define DEF_BIT_IS_SET(val, mask) (((((val) & (mask)) == (mask)) && ((mask) != 0u)) ? (DEF_YES) : (DEF_NO))
#define CPU_SW_EXCEPTION(err_rtn_val) do { \\
; \\
} while (1)
#define MEM_VAL_COPY_GET_INT32U(addr_dest, addr_src) do { \\
CPU_INT08U *destptr = (CPU_INT08U *)(addr_dest); \\
CPU_INT08U *srcptr = (CPU_INT08U *)(addr_src); \\
(*((destptr) + 0)) = (*((srcptr) + 0)); \\
(*((destptr) + 1)) = (*((srcptr) + 1)); \\
(*((destptr) + 2)) = (*((srcptr) + 2)); \\
(*((destptr) + 3)) = (*((srcptr) + 3)); } while (0)
#define MEM_VAL_COPY_GET_INTU(addr_dest, addr_src, val_size) do { \\
CPU_SIZE_T _i; \\
\\
for (_i = 0; _i < (val_size); _i++) { \\
(*(((CPU_INT08U *)(addr_dest)) + _i)) = (*(((CPU_INT08U *)(addr_src)) + _i)); \\
} \\
} while (0)
#define MEM_VAL_COPY_SET_INT32U(addr_dest, addr_src) MEM_VAL_COPY_GET_INT32U(addr_dest, addr_src)