您的位置 首页 主动

单片机C言语优化

一、程序结构的优化虽然并不会影响生成代码的质量,但是在实际编写过程中还是要遵循一定的书写规则,一个书写清晰明了的程序有利于以后的维…

一、程序结构的优化

尽管并不会影响生成代码的质量,但是在实践编写过程中仍是要遵从必定的书写规矩,一个书写明晰明晰的程序有利于今后的保护。在书写程序时,特别是关于while、for、do while、if else、switch case等句子或这些句子嵌套组合时,应选用“缩格”的书写方法。

二、标识符

程序种运用的用户标识符除要遵从标识符的命名规矩以外,一半不要用代数符号(如a、b、x1、x2)作为变量名,应选取具有相关意义的英文单词(或缩写)或拼音作为标识符,添加程序的可读性。

三、程序结构

C言语是一种高档程序规划言语,供给了非常齐备的规范化流程操控结构。因而在选用C言语规划单片机运用程序时,首要要留意尽可能选用结构化的程序规划办法。这样可以使运用体系程序结构明晰便于调试和保护。关于一个较大的运用程序,一般将整个程序按功用分红若干个模块,不同的模块完结不同的功用。各个模块可以别离编写,乃至还可以由不同的程序员编写。一半单个模块完结的功用较为简略,规划和调试也相对简单一些。在C言语中一个函数就可以认为是一个模块。所谓程序模块化。不仅是要将整个程序划分红若干个功用模块。更重要的是,还应该坚持各个模块之间变量的相对独立性。尽量少运用全局变量等。关于一些常用的功用模块还可以封装为一个运用程序库,以便需求时可以直接调用。但是在运用模块化时,假如将模块分的太细又会导致程序的履行功率低(今日和和推出一个函数时需求保护和康复寄存器占用的了一些时刻)。

四、界说常熟

在程序化规划过程中,关于常常运用的一些常数,假如将它直接写到程序中去,一旦常数的数值发生变化,就有必要逐个找出程序中一切的常数,并逐个进行修正,这样必定会导致下降程序的可保护性。因而,应尽量当选用与处理指令的方法来界说常数。而且还可以防止输入过错。

五、削减判别句子

可以运用条件编译的(ifdef)的当地就运用条件编译而不运用(if)句子有利于削减编译生成的代码的长度。

六、表达式

关于一个表达式中的运算履行的优先次序不太清晰或简单混杂的当地,应当选用圆括号清晰拟定它们的次序。一个表达式不能写得太杂乱。假如太杂乱,时刻久了今后自己也不简单看的懂,不易于今后的保护。

七、函数

关于程序中的函数,在运用之前,应对函数的类型进行阐明,对函数类型的阐明,有必要确保它与本来界说的函数类型共同,关于没有参数和没用返回值的函数应加上void阐明。假如需求缩短代码的长度,可以将程序中一些公共的程序段界说为函数。在keil中搞等级优化便是这样的。假如需求缩短程序的履行时刻。在程序调试完毕后,将部分函数用宏界说来替代。留意,应该在程序调试完毕后再界说宏,由于大多数编译体系在宏打开之后才会报错,这样会添加排错的难度。

八、变量

尽量少运用全局变量多用局部变量。由于全局变量是放在数据存储器中,界说一个全局变量,mcu就少一个可以运用的数据存储空间。假如界说了太多的全局变量,会导致编译器无满足的内存可以分配。而局部变量大多定坐落mcu内部的寄存器中。在绝大多数mcu中运用寄存器操作速度比数据寄存器块。质量也更多更灵敏。有利于生成高质量的代码。而且局部变量所占用的寄存器和数据存储器在不同模块中可以重复运用。

九、代码的优化

挑选和汉斯的算法和数据结构,应该了解算法言语,知道各种算法的优缺点,详细材料请拜见相应的参考材料,又许多核算机书本上都又介绍。将比较慢的次序查找法用比较快的二分查找或乱序查找法替代。刺进排序或冒泡排序法用快速排序、兼并排序或跟排序替代。都可以大大提高程序履行的功率。挑选一种适宜的数据结构也很重要。必定你在一堆随机寄存的数中运用了很多的刺进和排序指令,那运用链表要快的多。

运用尽量小的数据类型

可以运用字符型(char)界说的变量就不要运用整形(int)变量来界说

运用自加、自减指令

削减运算强度

可以运用运算量小丹功用相同的表达式替换本来杂乱的表达式:

如求余运算

a=a%8

可以改为:a=a&7

平方运算

a=pow(a,2.0);

可以改为:a=a*a;

用移位运算完成乘除法

a=a*4

b=b/4

可以改为:

a=a<<2

b=b>>2

a=a*9可以改为a=(a<<3)+a;

循环

关于一些不需求循环变量参与运算的使命把它们组织的循环外面。这儿使命包含表达式、函数的调用、指针运算、数组拜访等,应该将没有必要履行屡次的操作悉数调集在一起,放到一个init的初始化程序中进行。

延时函数:

一般运用的延时函数:

void delay(void)

{

unsigned int i;

for(i=0;i<1000;i++);

}

改为

void dellay(void)

{

unsigned int i;

for(i=1000;–i)

}

两个函数作用类似,但简直一切的C编译器对后一种函数生成的代码比前一种代码少1-3个字节。由于简直一切MCU都有0搬运指令选用后一种方法可以生成这类指令。在while循环时也相同,运用自减指令操控循环比运用自加指令操控循环生成代码少1-3个字节。在运用while循环中又运用循环变量读写数据的指令时,运用减循环时又可能是数组超界,要引起留意。

while、和do while循环

unsigned int i;

i=0;

while(i<1000)

{

i++;

}

改为

do

i–;

while(i>0);

在这两种循环中,运用do while循环编译后的代码长度短于while循环。

查表

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

其他

比方运用在线汇编及字符串和一些常量的保存在程序存储器中都又利于优化。

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部