这是AN1148中,硬件CRC和软件CRC计算速度的一个对比:
Case 1: Software Implementation Process 100 bytes = 800 bits Case 2: Hardware Module 100 bytes = 800 bits |
从中可以看到,速度上硬件CRC是软件CRC的8倍。
库函数:
在 Microchip C30
编译器中,包含了CRC的库函数,它在"crc.h"和"ecrc.h"这两个文件中进行了声明,它们分别对应了16位和32位的硬件CRC模块。主要的库函数分别是:
CRC_Calc_ChecksumWord、CRC_Calc_ChecksumByte
ECRC_Calc_ChecksumLong、ECRC_Calc_ChecksumWord、ECRC_Calc_ChecksumByte
只要初始化后,就可以计算校验值。
分析:
不过这个CRC模块使用起来也有一些小问题。我们以最常用的8位数据的CRC计算为例,让我们先看一看在应用笔记AN1148中的CRC计算函数,这个函数是Microchip官方提供的一个例子,应该也是C30库函数的原型:
unsigned int CRC_HW_calculateB(unsigned char unsigned int CRCCON = 0x0000F; // ="Length of for(j=0;j<Len;j++) if(CRCCONbits.CRCFUL==1)//check if FIFO is if(CRCCONbits.CRCGO!=1) if(Flag==0) while(CRCCONbits.CRCMPT!=1);//check if FIFO is empty Nop(); CRCCONbits.CRCGO=0; //stop CRC Nop(); if(Flag==1) // if odd number of for(j = 0; j < 8; j if(Carry) return CRCWDAT; }
|
因为是16位单片机,所以内部数据总线是16位的,这样在计算基于字节方式的数据(8bit)时,反而非常不方便。如果是计算的数据是偶数字节还好办,可以正好两个字节放入一个16位寄存器中;如果是奇数个,那么就会多出一个字节,还是需要通过软件的方式进行计算。这样不但显示有些重复,而且从代码效率上来说就显得比较低了,比纯软件方式代码还大,除非有大量的数据需要计算,否则看起来有些得不偿失。
参考资料:
用户1024274 2010-5-2 20:03
用户1483310 2010-3-26 09:28
用户120337 2010-3-25 20:21