0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于如何提高单片机执行效率的一些建议

j4AI_wujianying 来源:未知 作者:胡薇 2018-07-27 16:24 次阅读

首先,什么是执行效率?我们平常所说的执行效率就是使用相同的算法在相同输入条件下完成相同计算所产生的系统开销,目前来说一般会更多关注执行时间方面的开销。所有语言编写的代码最终要运行,都要转化成机器码。在更短的时间内完成相同的事那么效率就高。

关于如何提高C语言程序的执行效率,有如下建议:

1.尽量避免调用延时函数

没有带操作系统的程序只能在while(1)里面循环执行,如果在这里面调用大量的延时这样会很消耗CPU的资源,延时等于是让他在这歇着不干事了,只有中断里面的才会执行。如果仅仅是做一个LED一秒闪烁一次的程序,那么很简单,可以直接调用延时函数,但是实际的项目中往往在大循环里有很多事要做,对于实时性要求较高的场合就不行了。为了避免使用延时,可以使用定时器中断产生一个标志位,到了时间标志位置1,在主程序里面只需要检测标志位,置1了才执行一次,然后清标志。其他时间就去做别的事了,而不会在这等待了。最好的例子就是数码管的显示,使用中断调显示,在我们的例程里面有。然后是那个按键检测的,一般的程序都是做的while(!key)等待按键释放,如果按键一直按着,那后面的程序就永远得不到运行死在这了,其实可以做一个按键标志检测下降沿和上升沿就可以避免这个问题了。

2.写出来的代码要尽量简洁,避免重复

在10天学会单片机那本书上看到他写的数码管显示那部分代码,选中一个位,然后送数据,再选中一个位,再送数据,依次做完。代码重复率太高了,不仅占用过多的类存,而且执行效率差可读性差,仅仅是实现了功能而已,实际的编程可以做一个循环,for循环或者while循环。这样的代码看起来更有水平。

3.合理使用宏定义

在程序中如果某个变量或寄存器经常用到,可以使用宏定义定义一个新的名代替他,这样的好处是方便修改,比如液晶的数据端总线接的P1,现在想改到P0,那么只需要修改宏定义这里就可以了,编译器编译的时候,他会自动的把定义的名替换成实际的名称。

4.使用尽量小的数据类型

比如某个变量的值范围是0-255,那么就定义成unsigned char,当然也可以定义成unsigned int,但是这样造成了内存的浪费,而且运算时效率要低一点。如果数据没有负数的话,尽量定义成无符号的类型。应尽量避免定义成浮点型数据类型或双精度(占8个字节)类型,这两种类型运算时很消耗CPU资源。比如采集电压范围是0-5v,精确到小数点后三位,可以把采集到的数据扩大1000倍,即使最大也才到5000,然后多采集几次做个滤波算法,最后电压算出来后只需要在第一位后面加个小数点就可以了,变量定义成unsigned int 型变量就没问题了。

5.避免使用乘除法

乘除法很消耗CPU资源,查看汇编代码会发现,一个乘除法运算会编译出10几甚至几10行代码。如果是乘以或除以2的n次方,可以用>来实现,这种移位运算在编译时就已经算好了,所以代码很简洁,运算效率就高。但是需要特别注意运算符的优先级问题。

6.尽量使用复合赋值运算符

a=a+b与a+=b 这两个表达式有什么区别呢?前者是先计算a+b的值,然后保存到ACC寄存器,然后再把ACC寄存器的值赋给a,而后者是直接将a+b的值赋给a,节省一个步骤,虽然只节省了一条指令,但是当这个运算循环几千次几万次呢,那么效果很明显了。像其他的-=、*=、/=、%=等都是一样的。

7.尽量不要定义成全局变量

先来看一下局部变量,全局变量,静态局部变量,静态全局变量的异同:

(1)局部变量:在一个函数中或复合语句中定义的变量,在动态存储区分配存储单元,在调用时动态分配,在函数或复合语句结束时自动释放;

(2)静态局部变量:在一个函数中定义局部变量时,若加上static声明,则此变量为静态局部变量,在静态存储区分配存储单元,在程序运行期间都不释放;静态局部变量只能在该函数中使用;静态局部变量在编译时赋值(若在定义时未进行赋值处理,则默认赋值为0(对数值型变量)或空字符(对字符型变量));静态局部变量在函数调用结束后不自动释放,保留函数调用结束后的值;

(3)全局变量:在函数外定义的变量称为全局变量;全局变量在静态存储区分配存储单元,在程序运行期间都不释放,在文件中的函数均可调用该全局变量,其他文件内的函数调用全局变量,需加extern声明;

(4)静态全局变量:在函数外定义变量时,若加上static声明,则此变量为静态全局变量;静态全局变量在静态存储区分配存储单元,在程序运行期间都不释放,静态全局变量在编译时赋值(若在定义时未进行赋值处理,则默认赋值为0(对数值型变量)或空字符(对字符型变量));只能在当前文件中使用。

一般情况下就定义成局部变量,这样不仅运行更高效,而且很方便移植。局部变量大多定位于MCU内部的寄存器中,在绝大多数MCU中,使用寄存器操作速度比数据存储器快,指令也更多更灵活,有利于生成质量更高的代码,而且局部变量所的占用的寄存器和数据存储器在不同的模块中可以重复利用。

当中断里需要用到的变量时,就需要定义成全局变量,并且加volatile修饰一下,防止编译器优化。如果数据是只读的比如数码管的断码、汉字取模的字库需要放在ROM里,这样可以节省RAM51单片机是加code,高级点的单片机都是加const修饰。

8.选择合适的算法和数据结构

应该熟悉算法语言,知道各种算法的优缺点,具体资料请参见相应的参考资料,有很多计算机书籍上都有介绍。将比较慢的顺序查找法用较快的二分查找或乱序查找法代替,插入排序或冒泡排序法用快速排序、合并排序或根排序代替,都可以大大提高程序执行的效率。.

选择一种合适的数据结构也很重要。 指针是一个包含地址的变量,可对他指向的变量进行寻址。使用指针可以很容易的从一个变量移到下一个变量,故特别适合对大量变量进行操作的场合。数组与指针语句具有十分密切的关系,一般来说,指针比较灵活简洁,而数组则比较直观,容易理解。对于大部分的编译器,使用指针比使用数组生成的代码更短,执行效率更高。但是在Keil中则相反,使用数组比使用的指针生成的代码更短。

9.使用条件编译

一般情况下对C语言程序进行编译时,所有的程序都参加编译,但是有时希望对其中一部分内容只在满足一定条件才编译,这就是条件编译。条件编译可以根据实际情况,选择不同的编译范围,从而产生不同的代码。

10.嵌入汇编---杀手锏

汇编语言是效率最高的计算机语言,在一般项目开发当中一般都采用C 语言来开发的,因为嵌入汇编 之后会影响平台的移植性和可读性,不同平台的汇编指令是不兼容的。但是对于一些执着的程序员要求程序获得极致的运行的效率,他们都在C 语言中嵌入汇编,即“混合编程”。

注意:如果想嵌入汇编,一定要对汇编有深刻的了解。不到万不得已的情况,不要使用嵌入汇编。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6034

    文章

    44554

    浏览量

    634495
  • C语言
    +关注

    关注

    180

    文章

    7604

    浏览量

    136657

原文标题:如何提高单片机程序执行效率

文章出处:【微信号:wujianying_danpianji,微信公众号:单片机精讲吴鉴鹰】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    上传一些关于单片机的论文

    上传一些关于单片机的论文,希望对大家有用
    发表于 08-08 22:35

    学习单片机一些技巧

    单片机应用开发中,代码的使用效率问题、单片机抗干扰性和可靠性等问题仍困扰着工程师。为帮助工程师解决单片机设计上的难题,纳出单片机开发中应掌
    发表于 11-15 20:38

    单片机学习需要掌握的一些技巧

    抗干扰性和可靠性等问题仍困扰着工程师。那怎样解决单片机设计上的难题?这里为大家整理出单片机开发中应掌握的几个基本技巧。中国IC交易网、 如何提高C语言编程代码的
    发表于 07-29 11:54

    MCS 51单片机一些疑难指令的解析

    本文介绍了学习和运用MCS51系列单片机中的一些技巧,特别针对MCS51单片机一些疑难指令
    发表于 11-17 16:09 19次下载

    单片机教程二十六:关于单片机一些基本概念

    单片机教程二十六:关于单片机一些基本概念 随着电子技术的迅速发展,计算机已深入地渗透到我们的生活中,许多电子爱好者开始学习单片机
    发表于 05-15 23:24 626次阅读

    关于单片机一些基本概念

    关于单片机一些基本概念  随着电子技术的迅速发展,计算机已深入地渗透到我们的生活中,许多电子爱好者开始学习单片机知识,但单片机
    发表于 03-18 16:54 1096次阅读

    单片机一些开发技巧

      很多朋友正在学习单片机开发技术,但开发中免不了要碰到这样、那样的问题,有些问题可能无碍大局,但有一些问题却直接影响到产品的成本、体积、性能。这里介绍笔者的几个
    发表于 06-13 17:18 3033次阅读
    <b class='flag-5'>单片机</b>的<b class='flag-5'>一些</b>开发技巧

    关于单片机一些按键问题和代码详细资料总结

    本文档的主要内容详细介绍的是关于单片机一些按键问题和代码详细资料总结免费下载。
    发表于 06-18 17:44 2次下载
    <b class='flag-5'>关于</b><b class='flag-5'>单片机</b>的<b class='flag-5'>一些</b>按键问题和代码详细资料总结

    关于学习Linux的一些建议

    不管是在生活还是工作中,每个人都会逐渐养成一些小习惯。坏习惯旦形成就很难改正,所在在系统学习 Linux 之前,给大家一些建议,刻意去培养一些
    发表于 07-14 14:22 597次阅读

    单片机程序防破解的一些建议资料下载

    电子发烧友网为你提供单片机程序防破解的一些建议资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用户指南、解决方案等资料,希望可以帮助到广大的电子工程师们。
    发表于 04-04 08:41 23次下载
    <b class='flag-5'>单片机</b>程序防破解的<b class='flag-5'>一些</b><b class='flag-5'>建议</b>资料下载

    关于51的一些看法

    51单片机:我觉得51的架构是分为:它的硬件结构+指令集:CPU,ROM,RAM,片外ROM,片外RAM,总线,IO,中断,定时器,串口我学了后面的ARM重新来对51单片机一些简单的回顾,程序
    发表于 11-23 16:20 9次下载
    <b class='flag-5'>关于</b>51的<b class='flag-5'>一些</b>看法

    关于蓝桥杯单片机开发板矩阵键盘的一些

    关于蓝桥杯单片机开发板矩阵键盘的一些
    发表于 11-23 17:36 2次下载
    <b class='flag-5'>关于</b>蓝桥杯<b class='flag-5'>单片机</b>开发板矩阵键盘的<b class='flag-5'>一些</b>坑

    学习单片机,其实有一些技巧的

    单片机应用开发中,代码的使用效率问题、单片机抗干扰性和可靠性等问题仍困扰着工程师。为帮助工程师解决单片机设计上的难题,这里给大家归纳出单片机
    发表于 12-08 09:21 0次下载
    学习<b class='flag-5'>单片机</b>,其实有<b class='flag-5'>一些</b>技巧的

    如何提高单片机程序执行效率

    更短的时间内完成相同的事那么效率就高。 关于如何提高C语言程序的执行效率,有如下建议: 1.尽量
    发表于 02-11 15:42 6次下载
    如何<b class='flag-5'>提高</b><b class='flag-5'>单片机</b>程序<b class='flag-5'>执行</b><b class='flag-5'>效率</b>

    单片机“低耦合”的一些方法

    单片机“低耦合”的一些方法
    的头像 发表于 10-17 18:30 492次阅读