首要什么是履行功率。咱们往常所说的履行功率便是运用相同的算法在相同输入条件下完结相同核算所发生的体系开支,现在来说一般会更多重视履行时刻方面的开支。一切言语编写的代码终究要运转,都要转化成机器码。在更短的时刻内完结相同的事那么功率就高。
关于怎么进步C言语程序的履行功率,以我多年的编程经历在这儿我来谈谈我的主意:
1.尽量避免调用延时函数
没有带操作体系的程序只能在while(1)里边循环履行,假如在这儿边调用许多的延时这样会很耗费CPU的资源,延时等于是让他在这歇着不干事了,只要中止里边的才会履行。假如仅仅是做一个LED一秒闪耀一次的程序,那么很简单,能够直接调用延时函数,可是实践的项目中往往在大循环里有许多事要做,关于实时性要求较高的场合就不行了。为了避免运用延时,能够运用定时器中止发生一个标志位,到了时刻标志方位1,在主程序里边只需求检测标志位,置1了才履行一次,然后清标志。其他时刻就去做其他事了,而不会在这等候了。最好的比便利是数码管的显现,运用中止调显现,在咱们的例程里边有。然后是那个按键检测的,一般的程序都是做的while(!key)等候按键开释,假如按键一向按着,那后边的程序就永久得不到运转死在这了,其实能够做一个按键标志检测下降沿和上升沿就能够避免这个问题了。
2.写出来的代码要尽量简练,避免重复
在10天学会单片机那本书上看到他写的数码管显现那部分代码,选中一个位,然后送数据,再选中一个位,再送数据,顺次做完。代码重复率太高了,不只占用过多的类存,而且履行功率差可读性差,仅仅是完成了功用罢了,实践的编程能够做一个循环,for循环或许while循环。这样的代码看起来更有水平。
3.合理运用宏界说
在程序中假如某个变量或寄存器常常用到,能够运用宏界说界说一个新的名替代他,这样的优点是便利修正,比方液晶的数据端总线接的P1,现在想改到P0,那么只需求修正宏界说这儿就能够了,编译器编译的时分,他会主动的把界说的名替换成实践的称号。
4.运用尽量小的数据类型
比方某个变量的值规模是0-255,那么就界说成unsignedchar,当然也能够界说成unsignedint,可是这样造成了内存的糟蹋,而且运算时功率要低一点。假如数据没有负数的话,尽量界说成无符号的类型。应尽量避免界说成浮点型数据类型或双精度(占8个字节)类型,这两种类型运算时很耗费CPU资源。比方收集电压规模是0-5v,准确到小数点后三位,能够把收集到的数据扩展1000倍,即便最大也才到5000,然后多收集几回做个滤波算法,最终电压算出来后只需求在第一位后边加个小数点就能够了,变量界说成unsignedint型变量就没问题了。
5.避免运用乘除法
乘除法很耗费CPU资源,检查汇编代码会发现,一个乘除法运算会编译出10几乃至几10行代码。假如是乘以或除以2的n次方,能够用<<或>>来完成,这种移位运算在编译时就现已算好了,所以代码很简练,运算功率就高。可是需求特别留意运算符的优先级问题。
6.尽量运用复合赋值运算符
a=a+b与a+=b这两个表达式有什么区别呢?前者是先核算a+b的值,然后保存到ACC寄存器,然后再把ACC寄存器的值赋给a,而后者是直接将a+b的值赋给a,节约一个过程,尽管只节约了一条指令,可是当这个运算循环几千次几万次呢,那么作用很明显了。像其他的-=、*=、/=、%=等都是相同的。
7.尽量不要界说成全局变量
先来看一下局部变量,全局变量,静态局部变量,静态全局变量的异同:
(1)局部变量:在一个函数中或复合句子中界说的变量,在动态存储区分配存储单元,在调用时动态分配,在函数或复合句子完毕时主动开释;
(2)静态局部变量:在一个函数中界说局部变量时,若加上staTIc声明,则此变量为静态局部变量,在静态存储区分配存储单元,在程序运转期间都不开释;静态局部变量只能在该函数中运用;静态局部变量在编译时赋值(若在界说时未进行赋值处理,则默许赋值为0(对数值型变量)或空字符(对字符型变量));静态局部变量在函数调用完毕后不主动开释,保存函数调用完毕后的值;
(3)全局变量:在函数外界说的变量称为全局变量;全局变量在静态存储区分配存储单元,在程序运转期间都不开释,在文件中的函数均可调用该全局变量,其他文件内的函数调用全局变量,需加extern声明;
(4)静态全局变量:在函数外界说变量时,若加上staTIc声明,则此变量为静态全局变量;静态全局变量在静态存储区分配存储单元,在程序运转期间都不开释,静态全局变量在编译时赋值(若在界说时未进行赋值处理,则默许赋值为0(对数值型变量)或空字符(对字符型变量));只能在当前文件中运用。
一般状况下就界说成局部变量,这样不只运转更高效,而且很便利移植。局部变量大多定坐落MCU内部的寄存器中,在绝大多数MCU中,运用寄存器操作速度比数据存储器快,指令也更多更灵敏,有利于生成质量更高的代码,而且局部变量所的占用的寄存器和数据存储器在不同的模块中能够重复运用。
傍边止里需求用到的变量时,就需求界说成全局变量,而且加volaTIle润饰一下,避免编译器优化。假如数据是只读的比方数码管的断码、汉字取模的字库需求放在ROM里,这样能够节约RAM,51单片机是加code,高档点的单片机都是加const润饰。
8.挑选适宜的算法和数据结构
应该了解算法言语,知道各种算法的优缺点,详细材料请拜见相应的参考材料,有许多核算机书本上都有介绍。将比较慢的次序查找法用较快的二分查找或乱序查找法替代,插入排序或冒泡排序法用快速排序、兼并排序或根排序替代,都能够大大进步程序履行的功率。.
挑选一种适宜的数据结构也很重要。指针是一个包括地址的变量,可对他指向的变量进行寻址。运用指针能够很简单的从一个变量移到下一个变量,故特别合适对许多变量进行操作的场合。数组与指针句子具有非常亲近的联系,一般来说,指针比较灵敏简练,而数组则比较直观,简单了解。关于大部分的编译器,运用指针比运用数组生成的代码更短,履行功率更高。可是在Keil中则相反,运用数组比运用的指针生成的代码更短。
9.运用条件编译
一般状况下对C言语程序进行编译时,一切的程序都参与编译,可是有时期望对其间一部分内容只在满意必定条件才编译,这便是条件编译。条件编译能够依据实践状况,挑选不同的编译规模,然后发生不同的代码。
10.嵌入汇编—杀手锏
汇编言语是功率最高的核算机言语,在一般项目开发傍边一般都选用C言语来开发的,由于嵌入汇编之后会影响渠道的移植性和可读性,不同渠道的汇编指令是不兼容的。可是关于一些执着的程序员要求程序取得极致的运转的功率,他们都在C言语中嵌入汇编,即“混合编程”。留意:假如想嵌入汇编,必定要对汇编有深入的了解。不到万不得已的状况,不要运用嵌入汇编。
责任编辑;zl