如何优化C语言(单片机) ?

发布者:Huayu8888最新更新时间:2013-05-13 来源: 21IC关键字:C语言  单片机  数据结构 手机看文章 扫描二维码
随时随地手机看文章

1、选择合适的算法和数据结构

应该熟悉算法语言,知道各种算法的优缺点,具体资料请参见相应的参考资料,有很多计算机书籍上都有介绍。将比较慢的顺序查找法用较快的二分查找或乱序查找法代替,插入排序或冒泡排序法用快速排序、合并排序或根排序代替,都可以大大提高程序执行的效率。.选择一种合适的数据结构也很重要,比如你在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多。

数组与指针语句具有十分密码的关系,一般来说,指针比较灵活简洁,而数组则比较直观,容易理解。对于大部分的编译器,使用指针比使用数组生成的代码更短,执行效率更高。但是在Keil中则相反,使用数组比使用的指针生成的代码更短。

2、使用尽量小的数据类型

能够使用字符型(char)定义的变量,就不要使用整型(int)变量来定义;能够使用整型变量定义的变量就不要用长整型(long int),能不使用浮点型(float)变量就不要使用浮点型变量。当然,在定义变量后不要超过变量的作用范围,如果超过变量的范围赋值,C编译器并不报错,但程序运行结果却错了,而且这样的错误很难发现。

在ICCAVR中,可以在Options中设定使用printf参数,尽量使用基本型参数(%c、%d、%x、%X、%u和%s格式说明符),少用长整型参数(%ld、%lu、%lx和%lX格式说明符),至于浮点型的参数(%f)则尽量不要使用,其它C编译器也一样。在其它条件不变的情况下,使用%f参数,会使生成的代码的数量增加很多,执行速度降低。

3、使用自加、自减指令

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

4、减少运算的强度,本人深有感触

可以使用运算量小但功能相同的表达式替换原来复杂的的表达式。如下:

(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;[page]

说明:通常如果需要乘以或除以2n,都可以用移位的方法代替。在ICCAVR中,如果乘以2n,都可以生成左移的代码,而乘以其它的整数或除以任何数,均调用乘除法子程序。用移位的方法得到代码比调用乘除法子程序生成的代码效率高。实际上,只要是乘以或除以一个整数,均可以用移位的方法得到结果,如:

a=a*9

可以改为:

a=(a<<3)+a

5、循环

(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循环。

6、查表

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

7、其它

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

关键字:C语言  单片机  数据结构 引用地址:如何优化C语言(单片机) ?

上一篇:明晰C内存分配的五种方法的区别
下一篇:C语言中auto register static const volatile 区别

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

2051单片机和荧光数码管电子数字钟设计
2051 单片机 和荧光数码管电子数字钟设计 电路 图 2051 单片机 和荧光数码管电子数字钟设计读红外代码子程序******************************* org 0290h tt1:push dph ;保护现场 push dpl push a CC push psw jb 07h,ttt0 ;全部动作未完成则返回 jb 00h,ttt1 ;如果收到遥控引导码则进入接收识别模式 mov th1,#00h ;清T1,为接收做准备 mov tl1,#00h setb 00h ;设接收遥控波头准备好标志位 setb tr1 ;开T1中断 sjmp t
[单片机]
2051<font color='red'>单片机</font>和荧光数码管电子数字钟设计
芯钛科技完成新一轮融资,推动高性能车规MCU产品量产
8月3日消息,近日,上海芯钛信息科技有限公司(简称“芯钛科技”)继战略轮之后完成新一轮融资,重庆渝富资本领投。截至目前,芯钛科技已完成共计5轮融资,已获包括上汽、广汽、方广资本、深圳投控东海、火山石资本、上海国策等资本加持。 据悉,芯钛科技正全面开启高性能车规MCU产品的量产之路,填补国产高性能车规级控制芯片领域空白,率先实现国产技术突破。 资料显示,芯钛科技专注于面向汽车行业提供完整的芯片应用解决方案,产品包括Mizar安全芯片系列、Alioth通用MCU系列、Phecda外围设备系列等,产品应用涵盖了底盘控制、车身电子、智能网联、辅助驾驶等各类汽车电子应用需求。其量产芯片产品已与国内外主流Tier1及整车厂广泛合作,累
[汽车电子]
芯钛科技完成新一轮融资,推动高性能车规<font color='red'>MCU</font>产品量产
基于单片机的SD卡FAT文件系统读写设计
随着信息技术的飞速发展,高容量存储芯片日益向大容量小体积发展,其中以SD卡、Micro SD卡为突出代表。SD卡由日本松下、东芝及美国SanDisk公司于1999年8月共同开发研制。大小犹如一张邮票的SD卡,重量只有2 g,却拥有高记忆容量、快速数据传输率、极大的移动灵 活性以及很好的安全性。通过单片机处理SD卡信息,可以将信息化嵌入式产业向更小体积发展。考虑到稳定性与读取速度,研究中采用了Fr-eescale公司的16位单片机MC9S12XSl28MAA。为了进一步满足嵌入式研究的实时调试与应用需要,把SD卡的读取以及FATl6文件系统的读取写入移植到此单片机中,使开发应用有更好的扩展性。本文首次把FATl6文件系统的读取移
[单片机]
基于<font color='red'>单片机</font>的SD卡FAT文件系统读写设计
爱普生以低能耗驱动高性能微控制器
一直以来,“省、小、精”都是爱普生自创立以来就拥有的技术优势。爱普生不断运用省能源、省资源、省空间的节省技术制造稳定可靠、节能高效、循环再生的创新型产品,力求客户、环境和社会价值最大化。近日,爱普生公司又推出了S1C17706微控制器。该产品是爱普生16位S1C17700微控制器系列产品中显示器面积最大的一款产品,其最大的特点在于它的低能耗、高环保特性,仅依靠纽扣电池供电就可以呈现5120点的高清晰度影像。 目前,市场对具有高显示效果的显示屏需求日益旺盛。例如小型游戏机等依靠纽扣电池驱动电力的便携式设备对此类显示屏的需求尤其突出。为了满足用户更高质量、更生动影像的需求,爱普生在S1C17706微控制器采用了51
[单片机]
爱普生以低能耗驱动高性能<font color='red'>微控制器</font>
89S51单片机实现误差几微秒的计时程序
小弟学习单片机时间很短,这样的文章对于熟悉的人说很是菜,,不过我的目的不是显摆我多NB,其实我根本就是个菜鸟,我的目的只是想通过这篇文章给和我一样的初级学者有一定帮助,至少我把这个程序写出来后,自己对单片机的一些概念的理解确实有帮助,好了进入正题! 我们都知道单片机是工作在脉冲之下,而晶振这个电子元件就是核心,所以单片机里的计时计数器都是通过晶振的脉冲数量来计算的,晶振的规格主要就就是它的振荡频率,有12MHZ,11.0592MHZ,8MHZ等等,我们知道,机器周期就是通过 12 * 晶振的频率的倒数 得到的,比如使用12MHZ的单片机它的机器周期就是1微秒,也就是执行一个单指令周期需要的时间。说到这里很多初学者会有个和我
[单片机]
TI全新Hercules S570 ARM安全微控制器、電源管理IC
TI 全新 Hercules S570 ARM 安全微控制器、電源管理 IC 及馬達驅動器 快速啟動汽車及運輸設計 SafeTI 設計套件具有 32 位元 Hercules 安全微控制器、TPS65381-Q1 PMIC 及 DRV3201 馬達驅動器 可加速並簡化客戶馬達控制設計與認證 德州儀器宣佈推出 12 款全新 Hercules S570 ARM Cortex -R4 安全微控制器、配置 TPS65831-Q1 多軌安全電源管理積體電路 (power management integrated circuit; PMIC)與TI DRV3201-Q1 安全馬達驅動器。 Hercules S570 安全微控制器連同 TI
[汽车电子]
单片机控制的LED动态扫描显示原理
现已DS8为个位来讨论,十、百、千为分别为DS7、DS6、DS5。 1、首先要了解的是此数码管为共阴极数码管,即三极管Q16、Q15、Q14、Q13导通时数码管才能点亮,亦即相应的单片机P23、P22、P21、P20为低电平。 2、动态扫描显示原理如下: (1)P23、P22、P21、P20输出高电平,关闭所有数码管; (2)显示个位 把要显示的数据送到P10~P17,P23送低电平,延时5豪秒(时间不能太长,否则数码管会闪烁),P23送高电平; (3)显示十位 把要显示的数据送到P10~P17,P22送低电平,延时5豪秒(时间不能太长,否则数码管会闪烁),P22送高电平; (4)显示百位 把要显示的数据送到P10~P1
[单片机]
ZiLOG进军32位ARM-9 MCU市场,瞄准安全和POS等应用
ZiLOG公司日前宣布进军32位ARM-9 MCU市场。该公司充分借助其现有的技术知识,加上专注于特定应用市场的策略,以赢取安全和销售点(POS)应用领域的增长机会。这一领域的产品开发已有时日,并已获得成功。 ZiLOG进军32位领域并不是说进入了通用ARM-7市场。相反,它是指该公司扩展了其专用产品战略。在这种情况下,该公司将继续开发更先进、处理能力更强和更具集成性的核心产品系列——这些都奠基于ZiLOG现有在某些应用领域的领导地位、专门技术以及在这些赢得客户信赖的领域所累计的知识。 根据Nilson于2005年11月公布的数字,2004年,微控制器的全球POS市场规模为880万单位,且每年以18.1%的速度增长。目标应用包
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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