如何写出高效的单片机C语言程序代码

作者&投稿:牧咸 (若有异议请与网页底部的电邮联系)
如何写出高效率稳定的单片机代码~

要写出高效率稳定的单片机代码:
1、使用汇编语言编写。
2、熟练掌握和灵活应用各种算法。

1、首先调用,设置状态静态寄存器初值,计数静态寄存器初值;2、调用一次,检测一次,对比前次的静态变量,不同则计数增1后反回,相同则清除计数返回;3、再调用一次,检测一次,对比前次的静态变量,不同则计数增1后反回,相同则清除计数返回;4、最后调用一次,检测一次,作对比,相同则清除计数,不同则修改要更新的变量,改变状态静态变量,清除计数器,返回。

由于单片机的性能同电脑的性能是天渊之别的,无论从空间资源上、内存资源、工作频率,都是无法
与之比较的。PC 机编程基本上不用考虑空间的占用、内存的占用的问题,最终目的就是实现功能就可以了。
对于单片机来说就截然不同了,一般的单片机的Flash 和Ram 的资源是以KB 来衡量的,可想而知,单片
机的资源是少得可怜,为此我们必须想法设法榨尽其所有资源,将它的性能发挥到最佳,程序设计时必须
遵循以下几点进行优化:

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

2. 使用自加、自减指令
通常使用自加、自减指令和复合赋值表达式(如a-=1 及a+=1 等)都能够生成高质量的
程序代码,编译器通常都能够生成inc 和dec 之类的指令,而使用a=a+1 或a=a-1 之类
的指令,有很多C 编译器都会生成二到三个字节的指令。

3. 减少运算的强度
可以使用运算量小但功能相同的表达式替换原来复杂的的表达式。
(1) 求余运算
N= N %8 可以改为N = N &7
说明:位操作只需一个指令周期即可完成,而大部分的C 编译器的“%”运算均是调用子程序来
完成,代码长、执行速度慢。通常,只要求是求2n 方的余数,均可使用位操作的方法来代替。
(2) 平方运算
N=Pow(3,2) 可以改为N=3*3
说明:在有内置硬件乘法器的单片机中(如51 系列),乘法运算比求平方运算快得多, 因为浮点数
的求平方是通过调用子程序来实现的,乘法运算的子程序比平方运算的子程序代码短,执行速度快。
(3) 用位移代替乘法除法
N=M*8 可以改为N=M<<3
N=M/8 可以改为N=M>>3
说明:通常如果需要乘以或除以2n,都可以用移位的方法代替。如果乘以2n,都可以生成左移
的代码,而乘以其它的整数或除以任何数,均调用乘除法子程序。用移位的方法得到代码比调用乘除法子
程序生成的代码效率高。实际上,只要是乘以或除以一个整数,均可以用移位的方法得到结果。如N=M*9
可以改为N=(M<<3)+M;
(4) 自加自减的区别
例如我们平时使用的延时函数都是通过采用自加的方式来实现。
void DelayNms(UINT16 t)
{
UINT16 i,j;
for(i=0;i<t;i++)
for(j=0;i<1000;j++)
}
可以改为
void DelayNms(UINT16 t)
{
UINT16 i,j;
for(i=t;i>=0;i--)
for(j=1000;i>=0;j--)
}
说明:两个函数的延时效果相似,但几乎所有的C 编译对后一种函数生成的代码均比前一种代码少1~3
个字节,因为几乎所有的MCU 均有为0 转移的指令,采用后一种方式能够生成这类指令。

4. while 与do...while 的区别
void DelayNus(UINT16 t)
{
while(t--)
{
NOP();
}
}
可以改为
void DelayNus(UINT16 t)
{
do
{
NOP();
}while(--t)
}
说明:使用do…while 循环编译后生成的代码的长度短于while 循环。

5. register 关键字
void UARTPrintfString(INT8 *str)
{
while(*str && str)
{
UARTSendByte(*str++)
}
}
可以改为
void UARTPrintfString(INT8 *str)
{
register INT8 *pstr=str;
while(*pstr && pstr)
{
UARTSendByte(*pstr++)
}
}
说明:在声明局部变量的时候可以使用register 关键字。这就使得编译器把变量放入一个多用途的寄存
器中,而不是在堆栈中,合理使用这种方法可以提高执行速度。函数调用越是频繁,越是可能提高代码的
速度,注意register 关键字只是建议编译器而已。

6. volatile 关键字
volatile 总是与优化有关,编译器有一种技术叫做数据流分析,分析程序中的变量在哪里赋值、在
哪里使用、在哪里失效,分析结果可以用于常量合并,常量传播等优化,进一步可以死代码消除。一般来
说,volatile 关键字只用在以下三种情况:
a) 中断服务函数中修改的供其它程序检测的变量需要加volatile(参考本书高级实验程序)
b) 多任务环境下各任务间共享的标志应该加volatile
c) 存储器映射的硬件寄存器通常也要加volatile 说明,因为每次对它的读写都可能由不同意义
总之,volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素
更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码
就不再进行优化,从而可以提供对特殊地址的稳定访问。


如何写出高效的单片机C语言程序代码
N=Pow(3,2) 可以改为N=3*3 说明:在有内置硬件乘法器的单片机中(如51 系列),乘法运算比求平方运算快得多, 因为浮点数 的求平方是通过调用子程序来实现的,乘法运算的子程序比平方运算的子程序代码短,执行速度快。(3) 用位移代替乘法除法 N=M*8 可以改为N=M<<3 N=M\/8 可以改为N=M...

单片机用什么语言编程
C语言是一种高级编程语言,它具有结构清晰、可读性强、易于维护等优点。C语言编写的程序可以通过编译器转换为单片机能够执行的机器码。C语言具有丰富的数据类型和控制结构,支持函数和指针等概念,可以编写出高效、可移植的程序。此外,C语言还有大量的库函数和工具可供使用,可以简化单片机的开发过程。除了...

初学单片机 请教下过来人怎么学少走弯路 ?高速又高效
郭天祥的十天教你学会单片机的教学视频不错,要想学得比较全面的话推荐力天的手把手教你学单片机,如果想更好运用51的话最好学下汇编,在学完教学视频后,自己做个小制作,像电子万年历,控制小车,让你很快就能学得比较牢,还有,开发板是很需要的,proteus最好和keil联调才能发挥它的真正强大仿真能力...

怎样提高对单片机的编程能力?
我觉得单片机的编程不单单是掌握C语言就可以了,首先要弄通单片机的基本硬件功能。比如说中断,IO口,定时器,串口(暂时重要的就想到这么多)。这些可以弄本专讲单片机基础的书来看,推荐从51单片机学起。其实可以边做边学,弄点项目,不懂翻书看看,慢慢就掌握的啦。新手的难路虎还有开发环境,相对于...

单片机开发软件有哪些
4. 编写高效的程序代码:程序代码的效率对单片机系统的性能有显著影响,应编写高效的代码,减少执行时间和内存占用。5. 进行调试和测试:单片机开发过程中,调试和测试尤为重要,特别是硬件和软件的协同工作。使用专业测试仪器和软件对系统进行全面测试和验证,以确保系统的稳定性和可靠性。

如何更高效地实现51单片机流水灯
要高效实现51单片机的流水灯,就用定时器来控制好了,这样做效率最高。

除了汇编以外还可以用什么给单片机编程?
不可以用VB,不过可以用专门的C,比如Keil uVision2就同时支持汇编和C,详细语法依据不同的片子可能有些不同。

国产8位51单片机:品种丰富,功能强大
众多国内厂家如STC(宏晶)、弘观微科技和知夏科技等,均生产51单片机,提供多样化选择。以STC89C52为例,这款低功耗、高性能的CMOS微控制器,兼容Intel 8051,拥有8K字节Flash存储,工作电压范围广泛,内置通用I\/O口和定时器\/计数器,适用于多种嵌入式应用。国产8位51单片机类型繁多,如STC89C52之外,还有...

如何学习单片机?
汇编写程序代码效率高,但相对难度较大,而且很罗嗦,尤其是遇到算法方面的问题时,根本是麻烦的不得了,现在单片机的主频在不断的提高,我们完全不需要那么高效率的代码,因为有高频率的时钟,单片机的ROM也在不断的提高,足够装得下你用C语言写的任何代码,C语言的资料又多又好找,将来可移植性非常好...

51单片机控制指令详解
2. 51单片机控制指令详解 51单片机的指令通常是一字节,高效执行。这里,我们将介绍一些核心指令及其操作:MOV指令: 如 MOV A, #data 用于将数据从一个寄存器或内存地址传送到另一个,如 MOV R0, R2,MOV @R0, A。ADD指令: 如 ADD A, R1 进行加法运算,ADD A, #data 可以对数据进行更精确的...

韶关市17146977057: 如何写一段简洁高效的单片机C语言子程序,实现这样一个功能?
卜筠强力: 1、首先调用,设置状态静态寄存器初值,计数静态寄存器初值;2、调用一次,检测一次,对比前次的静态变量,不同则计数增1后反回,相同则清除计数返回;3、再调用一次,检测一次,对比前次的静态变量,不同则计数增1后反回,相同则清除计数返回;4、最后调用一次,检测一次,作对比,相同则清除计数,不同则修改要更新的变量,改变状态静态变量,清除计数器,返回.

韶关市17146977057: 单片机开发中应掌握的几个技巧 -
卜筠强力: 一、 如何提高C语言编程代码的效率 邓宏杰指出,用C语言进行单片机程序设计是单片机开发与应用的必然趋势.他强调:“如果使用C编程时,要达到最高的效率,最好熟悉所使用的C编译器.先试验一下每条C语言编译以后对应的汇编语言...

韶关市17146977057: 如何提高单片机C语言编程能力? -
卜筠强力: 1.先自己写一些小程序,然后再从网上下载些优秀代码回来,对比自己的程序,找出差别,认真对比学习,吃透优秀算法,慢慢积累.2.从小的模块程序开始,一步一步优化自己的程序,这样的话,以后写的大程序就慢慢好了,没事的时候多看...

韶关市17146977057: 如何学习高效率地编写单片机程序,for example C51 ? -
卜筠强力: 单片机小精灵,要1.2版的…… 关键不是这个,是你对实现的方法有没有想法,然后画成一个程序的流程图,分块去写, 做好接口设计……写注释……

韶关市17146977057: 在单片机 C 编成时,如何才能使生成的代码具有和汇编一样的效率? ...
卜筠强力: 如果是使用 C 语言编程时,不太可能生成的代码具有 1:1 和汇编一样的效 率.C 语言命令要被硬件识别并执行,必须通过编译器编译.编译器分为前端、 中端、后端.前端与各种计算机语言写的程序打交道,后端与处理器的基本指令 集接轨....

韶关市17146977057: 单片机的程序如何写好? -
卜筠强力: 中断等等,然后结合对硬件的了解来研究程序代码,可以先看别人写的代码,对于单片机的编程你就有一种豁然开朗的感觉了,汇编弄懂了,包括RAM单片机编程是与硬件密切联系的,找一些简单的,硬着头皮把它们读懂吃透,再模仿着修改和编写代码.万事入门难,只要你下的苦功夫,我认为你应该先认真学习单片机的硬件资源,ROM,不能一门心思研究指令和代码,比如你要学51编程,看懂一两个程序,你就要了解51单片机有哪些资源. 可以先学汇编语言,因为这是基础

韶关市17146977057: 单片机C语言怎么编程`
卜筠强力: 每一种单片机都有一套自己的C编译器,你可以直接用,也可以挂载到其他的编译环境中 比如 Wave6000 等 51系列的 推荐用keilV8 Microchip系列的推荐用HT-PICC 编译环境用MPLAB 然后编程代码部分你写好之后,编译,此时会生成一些文件,如*.hex ,*.bin …… 然后把.hex 文件 利用烧写器烧写到单片机里面 这样单片机就可以按照编译的程序执行了 单片机的种类不一样,程序代码也略有区别

韶关市17146977057: 如何用c语言编写单片机程序. -
卜筠强力: 使用单片机专用的编译器,比如AVR单片机要用ICC for AVR、AVR Studio 等.然后在选项中选择单片机型号,比如ATmega16、ATmega128.最后要查询单片机所对应的库,也就是头文件.包含对应的头文件,头文件中有定义好的单片机的变量名和函数,写程序要用到,比如引脚可能定义为PORTA,这些要记住,不可以写其他的变量名.具体写程序,和普通的C程序没有什么区别.

韶关市17146977057: 单片机C语言编程中,怎样用C语言实现高效易用的堆栈? -
卜筠强力: keil的堆栈是不需要自己分配的. 使用keil编程时,keil有个startup.a51文件,该文件会和你的源程序一起编译生成目标代码,该startup.a51中有一条语句MOV SP,#?STACK-1用来进行堆栈分配,而?STACK作为一个变量,其值是编译器根据你的程序自动决定的; 所以,使用keil编程不需要理会堆栈的. by the way:你可以参照keil下自带的一些例子,这些例子在..\keil\c51\examples下

韶关市17146977057: 现代单片机用C语言怎样编程 -
卜筠强力: 如果是用汇编语言编写程序,使用那些RAM单元,是由编程者自己安排的;那么占用的RAM空间,编程者就可以很容易的计算出来.如果是用C语言编写程序,使用那些RAM单元,编程者就不知道了;不同的编译软件、不同的编译条件,很复杂.必须由编译软件给出报告才能知道.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网