单片机提高C语言代码效率的方法

发布者:shengju最新更新时间:2014-01-13 来源: dqjsw关键字:单片机  C语言  代码效率 手机看文章 扫描二维码
随时随地手机看文章
     代码效率包括两个方面内容:代码的大小和代码执行速度。如果代码精简和执行速度快,我们就说这个代码效率高。一般情况下,代码精简了速度也相应提上来了。单片机的ROM和RAM的空间都很有限,当您编程时遇到单片机的ROM和RAM的不够用的时候,或者您的程序要求较高的执行速度时,我们就得面对解决代码效率问题了。如何提高代码效率?现笔者以一个LED闪烁的程序为例与您探讨。
#i nclude//包含头文件
sbit led=P2^0;//定义位变量led,使其关联单片机管脚P2.0
void Delayms(unsigned int t);//定义延时函数
int main(void)//主函数(C语言程序入口函数)
{
       while(1)
       {
             led=0;//P2.0拉低,点亮LED
             Delayms(500);//调用延时函数,延时500毫秒
             led=1;//P2.0拉高,熄灭LED
             Delayms(500);//调用延时函数,延时500毫秒
       }
       return 0;
}
void Delayms(unsigned int t)//延时函数
{
        unsigned int i,j;
        for(i=0;i
               for(j=0;j<120;j++);//大约延时1毫秒
}
        这是指示灯LED闪烁的C源码,这个源码在Keil uVision4 生成的程序代码是67个字节。下面我们就采用几个方法来提高这个程序的效率。
一.尽量定义局部变量
        单片机程序的全局变量一般是放在通用数据存储器(RAM)中,而局部变量一般是放在特殊功能寄存器当中。处理寄存器数据的速度比处理RAM数据要快,如果在一个局部函数里调用一个全局变量将会多生成好几个代码出来。所以,少定义全局变量,多定义局部变量。如上例中,如果把延时函数里的i和j定义为全局变量,编译后程序代码会增加到79个字节,多了12个字节。
二.省略函数定义
        在一个单片机程序里我们习惯在main函数的前面先定义被调用函数,然后在mian函数的下面再实现被调用函数。这样的写法固然是一个好习惯,但每定义一个函数会增加几个代码,而且函数形参数据类型越大、形参越多增加的代码就越多,显然这不是什么好事。如果不定义编译器又报错,怎么办?C编译器的编译顺序是从上往下编译,只要被调用的函数在主调函数调用之前实现就没有问题了。所以,笔者的习惯写法是不用定义函数,但要按先后顺序(被调用函数一定要在主调函数之前写好)来写函数实现,到最后再写main函数。这样做编译器不但不会报错,而且代码得到精简了。如上例中,把延时函数的定义删除了,然后把延时函数的实现搬到main函数的上面,编译后程序代码减少到63个字节,减少了4个字节。
三.省略函数形参
        函数带形参,是为了在函数调用时传递实参,不但可以避免重复代码出现,还可以通过传递不同的实参值多次调用函数且实现不同的函数功能,总体代码也会得到精简。在实际编程的时候,我们只要注意,还可以进一步精简代码。对于不是多次调用或者多次调用但实参值不变的函数我们可以省略函数形参。如上例中的延时函数,我们把它改成不带形参的函数:
void Delayms()//延时函数
{
     unsigned int i,j;
     for(i=0;i<500;i++)
          for(j=0;j<120;j++);//大约延时1毫秒
}
编译后,程序代码变成了56个字节,精简了11个字节。
四.改换运算符
       也许您可能没有注意到C运算符的运用也会影响程序代码的数量。如上例中,把延时函数里的自加运算符改成自减运算符后,如:
void Delayms(unsigned int t)//延时函数
{
     unsigned int i,j;
     for(i=t;i>0;i--)
-
 -
           for(j=120;j>0;j--);//
 

关键字:单片机  C语言  代码效率 引用地址:单片机提高C语言代码效率的方法

上一篇:单片机教学改革的思路与实践
下一篇:单片机编程语言_学习哪种编程语言好?

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

51单片机内部定时器/计数器实验
一、实验内容 使用MCS-51内部定时/计数器,定时1秒钟,CPU运用定时中断方式,实现每1秒钟输出状态发生一次反转,即发光管每隔1秒钟亮一次(P1.7接LED)。 根据实验内容编写一个程序,并在实验仪器上调试和验证。 二、仿真图 三、代码 C语言实现: # include reg52.h # include intrins.h # define uint unsigned int # define uchar unsigned char sbit LED=P1^0; uchar t,temp; void init(); void main() { t=0; init(); whil
[单片机]
51<font color='red'>单片机</font>内部定时器/计数器实验
结合DSP和微控制器特性、用于电机控制的单片处理器
正确地利用电机控制器可为电机控制以及许多相关系统和产品设计节约大量的成本。本文针对低成本、低功耗和程序代码要求较高的电机控制及其它应用,介绍了集成 DSP 和 MCU 特性的单片 处理器 解决方案,可为电机控制领域设计工程师进行器件选择提供参考。 Rich Hoefle 应用工程经理 DSP标准产品部 摩托罗拉公司 电机在人们日常生活中扮演着重要角色,从普通的家用电器到复杂的电子系统和计算机,电机为各种应用提供旋转运动或线性运动。随着大量更为复杂应用的出现,电机控制问题变得越来越重要。因此,需要开发出更为复杂的技术,以改善其性能、功耗和安全性。小型电机通常用于精度要求极高的应用,而大型电机,如用于机
[嵌入式]
结合DSP和<font color='red'>微控制器</font>特性、用于电机控制的单片处理器
基于单片机温度远程显示的实现
目前检测温度一般采用热电偶或热敏电阻作为传感器。这种传感器至仪表之间一般都要用专用的温度补偿导线;而温度补偿导线价格很贵,并且线路太长也会影响测量精度。在实际应用中往往需要对较远处(1 km左右)的温度信号进行监视。现有的解决方案有很多,例如:① 在现场用智能仪表对温度信号进行测量,用计算机作上位机与智能仪表进行通信来实现远程温度监测。采用这种方案要增加计算机设备及相关计算机软件。② NCU+DDC实现远程温度监测。用2个DDC,一个安装在现场测量温度,另一个安装在监视地,2个DDC通过NCU进行通信,从而实现远程温度监测。 但以上方案都存在成本高的问题。有没有低成本的解决方案呢?其实,在单片机应用日益广泛的今天,完全
[单片机]
基于<font color='red'>单片机</font>温度远程显示的实现
驱动永磁无刷直流电机的嵌入式微控制器
    摘要: 本文介绍了一种适用于控制永磁无刷直流电机的廉价嵌入式微控制器,并结合实例给出了软件和硬件两种控制方法。     关键词: 永磁无刷直流电机  控制  嵌入式微控制器 一、 概述 永磁无刷直流电机(Permanent Magnet Brushless DC Motor以下简称PMBLDC)由于其固有的特点,在家用消费类产品(空调、冰箱、洗衣机)和IT周边产品(打印机、软驱、硬驱)中得到广泛的应用。它具有结构简单、高效、低噪声、高功率密度、启动扭矩大、寿命长等其它种类直流电机无法比拟的特性。我国是稀土大国,稀土永磁材料经过这几年的发展,已经有了一定的规模,质量和数据都有较大的提高,价格已不断
[工业控制]
智能交通路口控制器的设计
近年来,随着我国经济的发展,城市的交通拥挤问题日趋严重,因此提高城市路网的通行能力、实现道路交通的科学化管理迫在眉睫。智能交通系统(ITS)在这种背景下应运而生 。 智能交通要求路口向控制中心实时提供图像和数据信息,并能够独立执行一些复杂的算法。但是目前国内的路口交通控制器大多采用单片机作为处理器,只能执行定时算法,以RS232或者RS485作为通讯方式,根本无法满足智能交通对于路口控制器的要求;而国外的路口控制器(如西门子公司的2070和美国的EAGLE)不能适合中国国情,且价格昂贵,操作不方便。因此研究开发出适合中国国情、性能价格比高的路口控制器成为一项特别紧迫的任务。 本课题组开发的TCS-0602智能交通路口控制器满足
[工业控制]
【自学51单片机】10 --PWM介绍、51单片机RAM区域划分
1、PWM介绍 PWM (Pulse Width Modulation) ,中文名为脉冲宽度调制,它能使用数字信号达到一个模拟信号的效果,脉冲宽度调制就是改变脉冲宽度来实现不同的效果。下面看图10-1三组脉冲信号。 它是一个周期为10ms,频率为100Hz的波形,每组高低电平脉冲宽度各不相同,也就是占空比(指高电平的时间占整个周期的比例)不同。 在数字电路中,只有0和1两种状态,在小灯中,0熄灭,1点亮。当让小灯亮灭间隔运行时,并且间隔时间不断减小,频率大于100Hz,肉眼看起来为一直保持亮状态,每个周期内不断改变小灯亮和灭的时间,小灯亮度也会发生变化,这就达到模拟电路的效果,不再是纯粹的0和1,还有亮度的不断变化。
[单片机]
【自学51<font color='red'>单片机</font>】10 --PWM介绍、51<font color='red'>单片机</font>RAM区域划分
利用单片机实现全数字图像的实时采集
引言 传统的方法是用视频采集卡(如1394)对视频信号进行采集,利用相应的软件传给PC机,既不方便,也不经济。本文介绍一种利用Cypress公司2002年发布的世界上第一块带 有USB2.0接口的芯片CY7C68013与PC机(主板为支持USB2.0的华硕主板PB533)实现了高分辨率(640×480点阵以上)、快速(24帧/s以上)、全数字图像的实时采集系统。 1 数字图像的实时采集原理 数字图像的实时采集原理如图1所示。在图1中,以Omnivision technologies公司的OV7620/7120芯片作为图像采集芯片,其主要特点是该芯片可提供0.5~30帧/s,640×480像素点阵CMOS的彩色或黑白数字图像,
[单片机]
利用<font color='red'>单片机</font>实现全数字图像的实时采集
AVR单片机IC卡程序
AVR单片机IC卡程序 #include io8535v.h #include macros.h #define uchar unsigned char #define uint unsigned int //**********定义全局变量*******************// //查表0 1 2 3 4 5 6 7 8 9 E F P OFF uchar table ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x79,0x71,0x73,0x00}; uchar I CC ode ;//定义IC卡复位时读出的4字节代码; uc
[单片机]
AVR<font color='red'>单片机</font>IC卡程序
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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