单片机C语言优化

发布者:SereneSpirit最新更新时间:2016-08-03 来源: eefocus关键字:单片机  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循环。

查表

在程序中一般不进行非常复杂的运算,如浮点数的程序及开方等。以及一些复杂的数学模型的插补运算。对这些即消耗时间又消耗资源的运算。应尽量使用查表的方式,并且将数据表置于程序存储区。如果直接生成所需的表比较困难。也尽量在启动时先计算。然后在数据存储器中生成所需要的表。在程序运行中直接查表就可以了。减少了程序执行过程中重复计算的工作量。

其他

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

关键字:单片机  C语言优化 引用地址:单片机C语言优化

上一篇:在IAR编译器中使用NEC 78K0系列单片机
下一篇:四位16进制转换成5位十进制源程序

推荐阅读最新更新时间:2024-03-16 15:03

基于SOPC技术的医用呼吸机主控系统
  呼吸机是可以代替人的呼吸功能或辅助人的呼吸功能的仪器。它适用于呼吸衰竭、甚至停止呼吸的病人做人工呼吸之用。它能帮助病人纠正缺氧和排出二氧化碳,是挽救某些危重病人生命的重要工具。   现有的呼吸机产品,其主控系统大多基于单片机来实现,对于功能强一些的产品就需要使用高端单片机,这样使得系统的成本比较高,而且外围的接口模块较多,结构复杂。使用SOPC(可编程片上系统)技术设计主控系统,可充分利用IP核的强大功能,精简外设数量,与此同时只占用了很小部分的资源,大大提高了系统的性价比。   本文利用SOPC技术设计了持续气道正压通气呼吸机的主控系统,使用了Altera公司的Nios II软核处理器以及一些通用的IP核,笔者基于Avalo
[医疗电子]
基于SOPC技术的医用呼吸机主控系统
PIC单片机定时器相关用法
什么是定时器? 定时器顾名思义就是用来定时的。在单片机应用中常常用于各种各样的定时。比如让LED灯每隔 1S 亮一次。 这个1S 就是由定时器做到的。 指令周期 指令周期就是单片机执行一个指令所花费的时间。这也是定时器定时的最小时间单位。时钟频率/4=指令频率。1/指令频率=指令周期。 假设现在的时钟是4MHZ ,4MHz的时钟经过4分频后变成了 1MHz 其周期为0.0000001s也就是1us,这个1us就是指令周期,这1us也就是定时器定时的最小单位。 定时器与预分频器 假设在没有预分频器情况下。开启定时器 每隔一个指令周期定时器就加一。假设时钟是4MHz 也就是每隔 1us 定时器加一。 如果有了预分频器假设预分
[单片机]
PIC<font color='red'>单片机</font>定时器相关用法
ARM7单片机(学习ing)—(三)、UART—02
总算是整好了~~ 基于LPC2106的Proteus仿真UART0~~ 重点就是频率的设置~~ 写程序是小事~~ 明白其中的PLL才是大事~~ 后面的程序里面有详细的介绍~~ 三、UART 三—(02)、向串口发送字符串(就是发送_Justin~~哈哈~~) 然后就是源代码: MDK3_1.c //------------------------------------------------------------------------------ //向串口发送字符串 //向串口UART0发送字符串“Designed by: _Justin //使用外部晶振12MHz;使用KEIL自带的启动代码Startu
[单片机]
ARM7<font color='red'>单片机</font>(学习ing)—(三)、UART—02
基于单片机的图像处理器6538的接口技术应用
6538是任天堂游戏机专用视频图像处理器芯片,它具有极强的图像处理能力。如果把6538用于8031单片机系统,把它较强的图像处理能力用于工业控制领域,将使单片机如虎添翼。而且6538在市场上极为常见,价格仅为十几元一片,在工业控制领域极有应用前途。 市场上常见的6538是台湾联华公司生产的UMC6538,其引脚排列如图1所示。它能在较少的外围电路支持下完成图像处理,直接输出复合视频信号,可直接送监视器显示。如果通过射频调制,可以用有线或无线方式在彩色或黑白电视机上显示图像。 6538可以显示分辨率为256×240点的彩色图像,每个点有52种颜色选择。6538所显示的图像由四个页面叠加而成,从前向后依此是卡通0页、背景页、卡通1页、
[单片机]
基于<font color='red'>单片机</font>的图像处理器6538的接口技术应用
STM32F103单片机驱动蜂鸣器
蜂鸣器在电子产品中很常见,几乎现在的家电中都有,主要用来做声音提示。 蜂鸣器从材料上分可以分为压电式蜂鸣器和电磁式蜂鸣器。 压电式蜂鸣器: 压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。 电磁式蜂鸣器:电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。 蜂鸣器从驱动方式上可以分为有源蜂鸣器和无源蜂鸣器。 有源蜂鸣器:内部自己带有驱动电路,只要在外部供上点之后,内部电路就会工作,驱动蜂鸣器内部分线圈进行振动,从而发出声音。 无源蜂鸣器:内部没有振荡电路,直接给蜂鸣器供直流电时,蜂鸣器不会响,只有外部给蜂鸣器提供一个方波,蜂鸣器才能发出声音。 驱动方式: 无源蜂鸣器
[单片机]
STM32F103<font color='red'>单片机</font>驱动蜂鸣器
基于MC9S08QG8低端微控制器的无线控制器设计
0 引 言   无线通信是人们现代日常生活的一部分,在办公室、学校或家庭等场所,都在接触无线通信设备,如笔记本电脑、打印机、摄像机、手持设备、照明控制器和家电设备等。这些设备的复杂程度与它们执行的任务类型有关,其中许多家庭自动化的无线应用采用小型微控制器和少量代码执行简单的任务,更加追求低成本、单一性和微型化。在目前众多的无线网络技术中,ZigBee技术作为一种新兴的无线网络技术,近两年在工业控制、消费电子等领域以及科研开发中得到了众多的关注和使用,而且越来越显示出它的强劲应用势头。ZigBee是一种低功耗、短距离和低速的无线网络技术,工作在2.4 GHz国际免执照的频段,在IEEE标准上它和无线局域网、蓝牙同属802家族中的
[嵌入式]
基于MC9S08QG8低端<font color='red'>微控制器</font>的无线控制器设计
51单片机-LED模块-来回流水灯
#include reg52.h #include intrins.h #define uchar unsigned char #define uint unsigned int #define ulong unsigned long sbit LED1 = P1^0; void Delay600ms(); //@11.0592MHz void main(void) { bit flag = 0; unsigned char cnt; LED1 = 0; while(1) { if(0==flag) { for(cnt=1;cnt 8;cnt++) { Delay600ms(); P1
[单片机]
基于8051单片机的双机通信设计
一、 系统功能要求: 1. 设计任务在一十字路口设置交通灯,并用单片机对其进行合理的控制。 时间方向 控制要求 白天 东西 绿灯 黄灯 红灯 南北 红灯 绿灯 黄灯 晚上 东西 黄灯 南北 红灯 2.总体设计方案现在流行的一种设计为两主干线相交的十字路。本设计采用一主干道(南北方向),一从干道(东西方向)的路口,即主干道的通行时间为从干道的2倍。在正常情况下,两干道的交通灯按图1进行转换,并以倒计数的方式将剩余时间显示在每个干道对应的两位LED上;另发挥部分为当出现紧急情况时,路口的交通灯全为红灯,紧急情况解除时,恢复到原来的状态。 二、 总体设计方案提示: 1.假设一个十字路口为东西南北走向。初始状态0为东西红灯,南北红
[单片机]
基于8051<font color='red'>单片机</font>的双机通信设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved