您的位置 首页 元件

怎么优化AVR C言语代码(程序员必读)

1、选择合适的算法和计算机书籍上都有介绍。将比较慢的顺序查找法用较快的二分查找或乱序查找法代替,插入排序或冒泡排序法用快速排序、合…

1、挑选适宜的算法和核算机书本上都有介绍。将比较慢的次序查找法用较快的二分查找或乱序查找
法替代,刺进排序或冒泡排序法用快速排序、兼并排序或根排序替代,都能够大大
进步程序履行的功率。.挑选一种适宜的数据结构也很重要,比方你在一堆随机存
放的数中运用了许多的刺进和删去指令,那运用链表要快得多。
数组与指针句子具有非常暗码的联系,一般来说,指针比较灵敏简练,而数组则比
较直观,简单了解。关于大部分的编译器,运用指针比运用数组生成的代码更短,
履行功率更高。但是在Keil中则相反,运用数组比运用的指针生成的代码更短。。

3、运用尽量小的数据类型
能够运用字符型(char)界说的变量,就不要运用
整型(int)变量来界说;能够运用
整型变量界说的变量就不要用长整型(long int),能不运用浮点型(float)变量就
不要运用浮点型变量。当然,在界说变量后不要超越变量的作用规模,假如超越变
量的规模赋值,C编译器并不报错,但程序运转成果却错了,而且这样的过错很难
发现。
ICCAVR中,能够在Options中设定运用printf参数,尽量运用根本型参数(%c、
%d、%x、%X、%u和%s格局阐明符),少用长整型参数(%ld、%lu、%lx和%lX格局阐明
符),至于浮点型的参数(%f)则尽量不要运用,其它C编译器也相同。在其它条件不
变的情况下,运用%f参数,会使生成的代码的数量添加许多,履行速度下降。

4、运用自加、自减指令
一般运用自加、自减指令和复合赋值表达式(如a-=1及a+=1等)都能够生成高质量的
程序代码,编译器一般都能够生成inc和dec之类的指令,而运用a=a+1或a=a-1之类
的指令,有许多C编译器都会生成二到三个字节的指令。在AVR单片适用的ICCAVR、
GCCAVR、IAR等C编译器以上几种书写办法生成的代码是相同的,也能够生成高质量
的inc和dec之类的的代码。

5、削减运算的强度
能够运用运算量小但功用相同的表达式替换本来杂乱的的表达式。如下:
(1)、求余运算。
a=a%8;
能够改为:
a=a&7;
阐明:位操作只需一个指令周期即可完结,而大部分的C编译器的“%”运算均是调
用子程序来完结,代码长、履行速度慢。一般,只需求是求2n方的余数,均可运用
位操作的办法来替代。

(2)、平方运算
a=pow(a,2.0);
能够改为:
a=a*a;
阐明:在有内置硬件乘法器的单片机中(如51系列),乘法运算比求平方运算快得多
,由于浮点数的求平方是经过调用子程序来完结的,在自带硬件乘法器的AVR单片
机中,如ATMega163中,乘法运算只需2个时钟周期就能够完结。既使是在没有内置
硬件乘法器的AVR单片机中,乘法运算的子程序比平方运算的子程序代码短,履行
速度快。
假如是求3次方,如:
a=pow(a,3.0);
更改为:
a=a*a*a;
则功率的改进更显着。

(3)、用移位完结乘除法运算
a=a*4;
b=b/4;
能够改为:
a=a<<2;
b=b>>2;
阐明:一般假如需求乘以或除以2n,都能够用移位的办法替代。在ICCAVR中,假如
乘以2n,都能够生成左移的代码,而乘以其它的整数或除以任何数,均调用乘除法
子程序。用移位的办法得到代码比调用乘除法子程序生成的代码功率高。实际上,
只需是乘以或除以一个整数,均能够用移位的办法得到成果,如:
a=a*9
能够改为:
a=(a<<3)+a 6、循环
(1)、循环语
关于一些不需求循环变量参与运算的使命能够把它们放到循环外面,这儿的使命包
括表达式、函数的调用、指针运算、数组拜访等,应该将没有必要履行屡次的操作
悉数调集在一起,放到一个init的初始化程序中进行。

(2)、延时函数:
一般运用的延时函数均选用自加的方法:
void delay (void)
{
unsigned int i;
for (i=0;i<1000;i++)
;
}
将其改为自减延时函数:
void delay (void)
{
unsigned int i;
for (i=1000;i>0;i–)
;
}
两个函数的延时作用类似,但简直一切的C编译对后一种函数生成的代码均比前一
种代码少1~3个字节,由于简直一切的MCU均有为0搬运的指令,选用后一种办法能
够生成这类指令。
在运用while循环时也相同,运用自减指令操控循环会比运用自加指令操控循环生
成的代码更少1~3个字母。
但是在循环中有经过循环变量“i”读写数组的指令时,运用预减循环时有可能使
数组超界,要引起留意。

(3)while循环和do…while循环
用while循环时有以下两种循环方法:
unsigned int i;
i=0;
while (i<1000)
{
i++;
//用户程序
}
或:
unsigned int i;
i=1000;
do
i–;
//用户程序
while (i>0);
在这两种循环中,运用do…while循环编译后生成的代码的长度短于while循环。

7、查表
在程序中一般不进行非常杂乱的运算,如浮点数的乘除及开方等,以及一些杂乱的
数学模型的插补运算,对这些即耗费时刻又消费资源的运算,应尽量运用查表的方
式,而且将数据表置于程序存储区。假如直接生成所需的表比较困难,也尽量在启
了,削减了程序履行过程中重复核算的工作量。

8、其它
比方运用在线汇编及将字符串和一些常量保存在程序存储器中,均有利于优化

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/yuanjian/275844.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部