如何优化单片机中的C程序

发布者:jiaohe1最新更新时间:2017-01-10 来源: eefocus关键字:优化  单片机中  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;
说明:通常如果需要乘以或除以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程序

上一篇:XC164单片机TwinCAN模块调试心得
下一篇:单片机的"位"

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

TMS320F206与CPU卡通信协议的优化
1 硬件电路 TMS320F206(简称F206)有1个通用输入引脚BIOS和1个通用输出引脚XF,此外还有IO0、IO1、IO2和IO3引脚,分别对应I/O状态寄存器的IO0~IO3。这4个引脚通过异步串行口寄存器(ASPCR)和I/O状态寄存器(IOSR)实现软件可控,可被单独配置成输入或输出。本文中使用IO0作为CPU卡(江苏意源公司iCos/Mil v1.0)的复位引脚,IO2作为CPU卡的I/O(输入/输出)引脚,电路图如图1所示。 2 软件实现 异步串行通信,传输协议bit流为:1位宽的低电平为起始位,8位宽的数据位,1位校验位,以及1位高电平的停止位。软件实现时,通过配置异步串行口寄存器(AS-PC
[嵌入式]
如何优化C语言(单片机) ?
1、选择合适的算法和数据结构 应该熟悉算法语言,知道各种算法的优缺点,具体资料请参见相应的参考资料,有很多计算机书籍上都有介绍。将比较慢的顺序查找法用较快的二分查找或乱序查找法代替,插入排序或冒泡排序法用快速排序、合并排序或根排序代替,都可以大大提高程序执行的效率。.选择一种合适的数据结构也很重要,比如你在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多。 数组与指针语句具有十分密码的关系,一般来说,指针比较灵活简洁,而数组则比较直观,容易理解。对于大部分的编译器,使用指针比使用数组生成的代码更短,执行效率更高。但是在Keil中则相反,使用数组比使用的指针生成的代码更短。 2、使用尽量小的数据类型 能够使用
[单片机]
ARM处理器NEON编程及优化技巧—左移右移等移位操作
ARM的NEON协处理器技术是一个64/128-bit的混合SIMD架构,用于加速包括视频编码解码、音频解码编码、3D图像、语音和图像等多媒体和信号处理应用。本文主要介绍如何使用NEON的汇编程序来写SIMD的代码,包括如何开始NEON的开发,如何高效的利用NEON。首先会关注内存操作,即如何变更指令来灵活有效的加载和存储数据。接下来是由于SIMD指令的应用而导致剩下的若干个单元的处理,然后是用一个矩阵乘法的例子来说明用NEON来进行SIMD优化,最后关注如何用NEON来优化各种各样的移位操作,左移或者右移以及双向移位等。本节详述NEON提供的各种各样的移位操作,左右移位,移位插入以及移位限定符如饱和舍入等以及这些移位操作如何能有效
[单片机]
ARM处理器NEON编程及<font color='red'>优化</font>技巧—左移右移等移位操作
新款TI C2000 Piccolo微控制器在电源控制应用实现效率最大化
德州仪器(TI)近日推出C2000™ Piccolo™微控制器(MCU)产品组合的最新产品。 新型 C2000 F28004x MCU系列针对电动汽车车载充电器、电机控制逆变器和工业电源等成本敏感型应用的电源控制进行优化,具有卓越的性能。通过添加集成浮点单元、数学加速器和可选并行处理器的这一新型实时控制装置,C2000 Piccolo MCU产品组合进一步提高了100-MHz中央处理器(CPU)的性能,设定了新的行业标准。 开发人员可以利用业界领先的C2000 Piccolo F28004x MCU集成模拟功能减少物料成本,同时构建更小、更可靠的系统,提供系统保护和新功能,实现高性能的电源控制系统。集成的模拟功能包括三个带有后
[电源管理]
PIC单片机独立式按键结构器
  PIC 单片机中独立式按键结构器扩展主要功能模块如下:   · 单片机系统:实现PIC单片机对独立式键盘的控制,查看按键的状态变化,判断是否有按键按下;   · 外围电路:实现PIC单片机与独立式键盘的电路接口;   · PIC程序:编写PIC单片机和独立式键盘的接口程序,实现对按键的识别和处理。 通过这个实例,读者应该掌握以下的内容:   · 了解独立式键盘的结构及原理;   · 掌握独立式键盘的作用。
[单片机]
优化的Micrium OS和新Platform Builder加速嵌入式的设计
   2017年3月8日 – Micrium OS是最新发展的、通过验证的嵌入式 μC/ OS™实时操作系统(RTOS),目前已经上市。Micrium OS拥有优化的RTOS内核,通信协议栈,文件系统和图形用户界面。新的Platform Builder工具可以简化开发,一旦开发者确定所需要的组件,该工具可自动解析组件之间的依赖性问题,以及配置启动顺序。使用Micrium OS 和Platform Builder可为开发人员提供强大的嵌入式 设计方法,显著地降低初始设计的复杂性,以及加快产品上市时间。该操作系统可支持所有主要的半导体供应商,包括恩智浦,瑞萨,Silicon Labs和意法半导体 。下面就随嵌入式小编一起来了解一下相关
[嵌入式]
详解PI如何利用组合技术,优化功率开关电源的设计和成本
能效已经成为所有电子产品越来越关注的焦点之一,一方面这意味着可以节省更多的能源,减少碳排放;另外更高的能效意味着更小,更紧凑且更轻薄的电源系统,这可以使电子产品在成本,尺寸,易用性等方面不断进步。 对于电源来说,由于牵扯到诸多分立元件、变压器、功耗、散热器、EMI、布线、保护等等诸多元素,还要着重考虑SWaP-C,因此高集成度似乎成为了目前电源管理技术的唯一突破点。通过高集成度,设计人员可以极大减少设计周期,降低开发难度与系统成本。 Power Integrations(PI)是一家成立于1988年的电源管理芯片供应商,自成立之初就将Integration(集成)作为公司最大的产品竞争差异化,通过一步步将各类功率器件及其他
[电源管理]
详解PI如何利用组合技术,<font color='red'>优化</font><font color='red'>中</font>功率开关电源的设计和成本
基于Honeywell DCS的锅炉燃烧稳态优化控制
热电厂提供的能源主要是以电能和热能的形式出现的,通常是利用锅炉生成蒸汽,然后将其中一部分提供给汽机发电,提供电力能源,另一部分作为热源直接供给用户。无论最后提供的能源形式是何种方式,锅炉负荷总是变化的。负荷既包含电力负荷也包含热能负苛。近年来,为解决锅炉燃烧过程的优化控制问题,国内外采取了多种控制手段。尽管它们在一定程序上提高了热效率,但不能彻底解决锅炉燃烧的控制问题,因为难于建立被控对象的精确数学模型 ,仍需要根据负荷变化,人工调控锅炉运行,才能使锅炉燃烧过程更多时间处于相对平衡状态,提高燃烧效率。 为了达到提高燃烧效率这个目的,采用 Honeywell S9000系统构建集散控制系统,建立一个锅炉、汽机和电网、热网的监控系统
[工业控制]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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