我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:王中王 > 定点运算 >

为什么结构优化和能带计算所用的方法不一样

归档日期:08-14       文本归类:定点运算      文章编辑:爱尚语录

  CRC校验又称为循环冗余校验,是数据通讯中常用的一种校验算法。它可以有效的判别出数据在传输过程中是否发生了错误,从而保障了传输的数据可靠性。CRC校验有多种方式,如:CRC8、CRC16、CRC32等等。在实际使用中,我们经常使用CRC16校验。CRC16校验也有多种,如:1005多项式、1021多项式(CRC-ITU)等。在这里我们不讨论CRC算法是怎样产生的,而是重点落在几种算法的C51程序的优化上。计算CRC校验时,最常用的计算方式有三种:查表、计算、查表+计算。一般来说,查表法最快,但是需要较大的空间存放表格;计算法最慢,但是代码最简洁、占用空间最小;而在既要求速度,空间又比较紧张时常用查表+计算法。下面我们分别就这三种方法进行讨论和比较。这里以使用广泛的51单片机为例,分别用查表、计算、查表+计算三种方法计算1021多项式(CRC-ITU)校验。原始程序都是在网上或杂志上经常能见到的,相信大家也比较熟悉了,甚至就是正在使用或已经使用过的程序。编译平台采用KeilC517.0,使用小内存模式,编译器默认的优化方式。常用的查表法程序如下,这是网上经常能够看到的程序范例。因为篇幅关系,省略了大部分表格的内容。codeunsignedintCrc1021Table[256]={0x0000,0x1021,0x2042,0x3063,0x1ef0};unsignedintcrc0(unsignedchar*pData,unsignedcharnLength){unsignedintCRC16=0;while(nLength0){CRC16=(CRC168)^*pData)nLength--;pData++;}returnCRC16;}编译后,函数crc0的代码为68字节,加上表格占用的512字节,一共使用了580个字节的代码空间。下面是常见的计算法的程序:unsignedintcrc2(unsignedchar*ptr,unsignedcharcount){unsignedintcrc=0;unsignedchari;while(count--0){crc=(crc^(((unsignedint)*ptr)0){da=((crc/256))/16;/*暂存CRC的高四位*/crc0;i--){if(crc.c[0]&0x70)crc.x=(crc.x4)^(*ptr4);crc.x4)^(*ptrcrc.xidataxdata;3.使用最小的变量类型,能使用整型时就不要使用长整型,能使用字符型时就不要使用整型;4.多使用局部变量,少使用全局变量、静态变量,这样可以充分利用Keil提供的变量覆盖技术。同时局部变量也要尽量使用寄存器变量;5.少使用浮点数。使用浮点数需要连接浮点库,会增加大约1K的代码;而且浮点运算的速度是很慢的,没有特殊情况尽量使用定点数代替浮点数;6.没有必要就不要使用printf等标准输入输出函数,它会增加大约3K的代码。7.函数带有的参数不要太多,多了会影响效率;8.注意C51的特点,按照C51的特点编写程序;9.多用几种方法优化,比较后找出最佳方法;10.注意软件的写法,有时一个写法上很小的变化就会有意想不到的效果。因为Keil的优化是与上下文的程序相关的,对于不同的情况产生不同的优化。如果对比一下产生的汇编代码,就能够更加容易的找出不合理的代码,从而有针对性的优化了;11.不要过于依赖C51提供的优化功能,能够自己优化的地方就自己手工优化了,程序不可能完成所有的事情;12.不同版本的C51(特别是6.0和7.0的版本与低于6.0的版本相比)产生的优化效果可能会不同,产生的代码会不完全一样,需要特别注意;13.在循环中比较条件尽量与0作比较(这与51单片机的特点有关,对比一下编译产生的汇编代码就明白了),这样可以减少代码,加快速度。如:将while(n10)修改为while(n!=0);14.在循环中比较中不要直接使用n--或n++,而要分开写,这样产生的代码较小。如:while(n--!=0)修改为while(n!=0){n--;//其他代码}15.尽量不要使用太复杂的表达式,虽然这样程序简洁,但是对程序的调试不方便。只要能充分考虑到所使用的单片机的特点,在加上一些经验和技巧,就一定可以编写出高性能的程序来。

本文链接:http://brazil-run.com/dingdianyunsuan/1012.html