如何高效率编写单片机代码,优化程序设计

您所在的位置:网站首页 代码怎么编写 如何高效率编写单片机代码,优化程序设计

如何高效率编写单片机代码,优化程序设计

#如何高效率编写单片机代码,优化程序设计| 来源: 网络整理| 查看: 265

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

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

能用unsiged就不用signed;能用char就不用int;能不用floating就不用;能用位操作不用算数。

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

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

如N=M*9可以改为N=(M

(4) 自加自减的区别

例如我们平时使用的延时函数都是通过采用自加的方式来实现。

void DelayNms(UINT16 t){UINT16 i,j;for(i=0;idefine MAX(A,B) {(A)>(B)?(A):(B)}

说明:函数和宏函数的区别就在于,宏函数占用了大量的空间,而函数占用了时间。大家要知道的是,函数调用是要使用系统的栈来保存数据的,如果编译器里有栈检查选项,一般在函数的头会嵌入一些汇编语句对当前栈进行检查;同时,CPU也要在函数调用时保存和恢复当前的现场,进行压栈和弹栈操作,所以,函数调用需要一些CPU时间。而宏函数不存在这个问题。宏函数仅仅作为预先写好的代码嵌入到当前程序,不会产生函数调用,所以仅仅是占用了空间,在频繁调用同一个宏函数的时候,该现象尤其突出。

1.适当地使用算法

假如有一道算术题,求1~100 的和。

作为程序员的我们会毫不犹豫地点击键盘写出以下的计算方法:

UINT16 Sum(void){UINT8 i,s;for(i=1;i

很明显大家都会想到这种方法,但是效率方面并不如意,我们需要动脑筋,就是采用数学算法解决问题,使计算效率提升一个级别。

UINT16 Sum(void){UINT16 s;s=(100 *(100+1))>>1;return s;}

结果很明显,同样的结果不同的计算方法,运行效率会有大大不同,所以我们需要最大限度地通过数学的方法提高程序的执行效率。

2.用指针代替数组

在许多种情况下,可以用指针运算代替数组索引,这样做常常能产生又快又短的代码。与数组索引相比,指针一般能使代码速度更快,占用空间更少。使用多维数组时差异更明显。下面的代码作用是相同的,但是效率不一样。

UINT8 szArrayA[64];UINT8 szArrayB[64];UINT8 i;UINT8 *p=szArray;for(i=0;i

指针方法的优点是,szArrayA 的地址装入指针p 后,在每次循环中只需对p 增量操作。在数组索引方法中,每次循环中都必须进行基于i 值求数组下标的复杂运算。

3.强制转换

C 语言精髓第一精髓就是指针的使用,第二精髓就是强制转换的使用,恰当地利用指针和强制转换不但可以提供程序效率,而且使程序更加之简洁,由于强制转换在C 语言编程中占有重要的地位,下面将已五个比较典型的例子作为讲解。

例子1:将带符号字节整型转换为无符号字节整型

UINT8 a=0;INT8 b=-3;a=(UINT8)b;

例子2:在大端模式下(8051 系列单片机是大端模式),将数组a[2]转化为无符号16 位整型值。

方法1:采用位移方法。

UINT8 a[2]={0x12,0x34};UINT16 b=0;b=(a[0]

结果:b=0x1234

方法2:强制类型转换。

UINT8 a[2]={0x12,0x34};

UINT16 b=0;

b= (UINT16 )a; //强制转换

结果:b=0x1234

例子3:保存结构体数据内容。

方法1:逐个保存。

typedef struct _ST{UINT8 a;UINT8 b;UINT8 c;UINT8 d;UINT8 e;}ST;ST s;UINT8 a[5]={0};s.a=1;s.b=2;s.c=3;s.d=4;s.e=5;a[0]=s.a;a[1]=s.b;a[2]=s.c;a[3]=s.d;a[4]=s.e;

结果:数组a 存储的内容是1、2、3、4、5。

方法2:强制类型转换。

typedef struct _ST{UINT8 a;UINT8 b;UINT8 c;UINT8 d;UINT8 e;}ST;ST s;UINT8 a[5]={0};UINT8 p=(UINT8 )&s;//强制转换UINT8 i=0;s.a=1;s.b=2;s.c=3;s.d=4;s.e=5;for(i=0;i

define Perror(FUN) printf(“Err:%s %s %d: %s ”, FILE, func,LINE,FUN) 类linux的perror函数实现,这里加了出错的文件位置,所在函数,引发出错调用的函数FUN。

宏中#和##的用法define STR(s) #sdefine CONS(a, b) int(a##e##b)printf(STR(vck));//输出vckprintf(“%d ”, CONS(2,3));//2e3 输出2000

这些方法常用,必然会让你的代码更加简洁高效!

原文标题:编写高效率稳定的单片机代码,其实也没你想得那么难~

文章出处:【微信号:Mouser-Community,微信公众号:贸泽电子设计圈】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

扫一扫,分享给好友

复制链接分享 评论

发布评论请先 登录

相关推荐

分享一些单片机相关的理论知识 无论是初学单片机还是在学校的人来说,如果只是按教科书式的学法,上来就搞一堆名词指令,学了几个月还搞不.... 发表于 03-17 12:40 • 14次 阅读 分享一些单片机相关的理论知识 单身girl自学硬件的第一天… 前几天发了一篇求助贴:求大佬帮我指条明路能助我快速入门电子领域。帖子是个好帖子,怎么说也大一万人看,但怎么就没人看看我的... 发表于 03-17 11:08 • 542次 阅读 单身girl自学硬件的第一天… 小编科普一下有关单片机串口驱动框架封装的知识 在 serial.c 的 rt_serial_write 中         /* DMA mode Tx */      &nbs... 发表于 03-17 09:21 • 349次 阅读 单片机字符串转各种位宽的函数 十进制数值字符串转各种位宽的整形数据demo 本demo实现了字符串转各种位宽的函数,代码简单效率高,非常适合单片机嵌入式应用。... 发表于 03-16 23:51 • 307次 阅读 stm32、51单片机和AVR单片机到底选哪一个 这些都是非常好的单片机学习路径,低中高单片机都是有大量的应用范围,只是分为不同的领域,工程、家用、军.... 发表于 03-16 10:39 • 14次 阅读 stm32、51单片机和AVR单片机到底选哪一个 想问一下cubemx在rt-thread studio中怎么用 想问一下cubemx在rt-thread studio中怎么用?我配置完cubemx生成代码后,在studio中编译后会出现一个叫做cubemx的文件夹,然后编... 发表于 03-16 09:19 • 374次 阅读 为什么说C语言程序运行时要比其他语言编写的程序快得多 C语言程序运行时要比其他语言编写的程序快得多,因为它“离底层机器很近”,这个说法正确吗? 的头像 C语言编程学习基地 发表于 03-16 08:45 • 91次 阅读 FPGA重构优势有哪些 术语“重构”是指FPGA已经配置后的重新编程。FPGA的重构有两种类型:完全的和部分的。完全重构将整.... 的头像 FPGA技术联盟 发表于 03-15 17:06 • 608次 阅读 单片机学习都时候需要注意的步骤—依葫芦画瓢 很多朋友无论在学习什么东西的时候喜欢看别人的视频和程序,这些都能看懂然后就觉得自己都会了,等到自己写.... 发表于 03-15 17:04 • 31次 阅读 单片机学习都时候需要注意的步骤—依葫芦画瓢 NXP iMX8MP开发板在UUU烧写时卡在99% 来源 | 飞凌嵌入式 题图|OKMX8MP-C开发板 近期查看飞凌嵌入式技术支持部门问题反馈列表时,.... 发表于 03-15 16:24 • 13次 阅读 单片机实现24C02存储上次使用中状态的C语言实例 单片机实现24C02存储上次使用中状态的C语言实例 发表于 03-15 14:19 • 18次 阅读 函数模板与类模板的基本概念及实现原理 [导读] 最近使用C++做些编程,把日常遇到的些比较重要的概念总结分享一下。本文来分享一下模板类的原.... 的头像 FPGA之家 发表于 03-15 11:21 • 110次 阅读 UART通用异步收发器与SPI串行外设接口及I2C总线比较 在单片机开发中,UART、I2C、RS485等普遍在用,对它们的认识可能模棱两可,本文把它们整理了一.... 的头像 STM32嵌入式开发 发表于 03-15 09:50 • 145次 阅读 ICT的圣杯(一):人形电脑天使心 如果有一天,人工智能被用来残害人类,或者让人类自相残杀,你还会认可并支持这个技术吗? 如果你的答案是.... 的头像 脑极体 发表于 03-15 09:31 • 285次 阅读 脉冲的三种形式解析 脉冲信号可以分为AB相脉冲,脉冲+方向,CW/CCW脉冲。 这三种信号格式,在十几年前或者还有明显的相对优缺点和适用场合,... 发表于 03-14 23:36 • 333次 阅读 七天物联网智能家居实战学习笔记(六) UDP 连接流程 复位:AT+RST 模式设置:AT+CWMODE_DEF=1 WIFI 连接:AT.... 发表于 03-14 21:57 • 8次 阅读 AT32 SPI和I2S入门指南 SPI(SerialPeripheral interface)是一种由Motorola最先推出的同步串行传输协议。SPI是一种高速、全双工、同步的通信总线... 发表于 03-14 19:49 • 753次 阅读 单片机的中断系统是什么,它的作用是什么 这个还用问?答案肯定不是。学习 51单片机好处是,学会51之后自然就会举一反三和融会贯通,市面上单片.... 发表于 03-14 17:20 • 24次 阅读 单片机的中断系统是什么,它的作用是什么 Q-Writer 4.30应用程序 Q-Writer 4.30 发表于 03-14 14:44 • 10次 阅读 FPGA与MCU的程序思路 FPGA以9600的波特率向单片机发送32位数据,然后单片机对数据进行解析,显示在显示屏上面 的头像 FPGA之家 发表于 03-14 14:07 • 1130次 阅读 基于linkboy+ESP32的创意DIY时钟设计 以linkboy为编程平台,创意DIY时钟,数字式时钟、电子日历、指针式时钟,想要哪种做哪种!lin.... 的头像 linkboy知多少 发表于 03-14 08:56 • 160次 阅读 基于linkboy+ESP32的创意DIY时钟设计 求解答 我想用档位来控制单片机的p1.0和p1.1口的输出,从而控制继电器的闭合,程序没报错,但是仿真时这两个引脚没反应是什么情况 求大... 发表于 03-12 21:49 • 1308次 阅读 单片机新手近半年的学习感悟分享 我曾经听过一位脱口秀表演者的演说,有一句话我至今印象不减:“人为什么一定要去大学,为什么有的人不去大.... 的头像 Jonathansin 发表于 03-12 14:58 • 753次 阅读 VK2C23B高抗干扰段码LCD低功耗液晶驱动芯片 VK2C23B LQFP48是一个点阵式存储映射的LCD驱动器,可支持最大280点(35SEGx8C.... 发表于 03-12 14:51 • 14次 阅读 VK2C23B高抗干扰段码LCD低功耗液晶驱动芯片 详解C语言中的短路现象   C语言一经出现,就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语.... 的头像 嵌入式ARM 发表于 03-12 12:23 • 535次 阅读 详解C语言中的短路现象 51单片机指令快速记忆方法总结 学习单片机,除了搞清单片机内部功能、存储空间分配及I/O接口外,还应掌握其指令系统。MCS-51共有.... 的头像 嵌入式ARM 发表于 03-12 12:04 • 525次 阅读 编写一个简单的C51程序 对于嵌入式系统,如果没有运行RTOS,那么程序开发中的 主函数(main())需要通过某种机制使其永.... 的头像 嵌入式ARM 发表于 03-12 11:17 • 341次 阅读 深入介绍三种不同的程序架构 在嵌入式软件开发,包括单片机开发中,软件架构对于开发人员是一个必须认真考虑的问题。软件架构对于系统整.... 的头像 嵌入式ARM 发表于 03-12 08:36 • 279次 阅读 MOS管驱动的全桥电路原理详解 电路首先,单片机能够输出直流信号,但是它的驱动才能也是有限的,所以单片机普通做驱动信号,驱动大的功率.... 的头像 电源研发精英圈 发表于 03-12 08:10 • 263次 阅读 基于全志A40i核心板实现的呼吸机解决方案 导读 呼吸机是一种用来替代,控制或者改变患者正常的生理呼吸,增加患者肺活量,改善呼吸功能,维持患者体.... 发表于 03-11 16:05 • 16次 阅读 我与电子打交道的这些年——谈谈我是如何踏上电子工程师这条路 正式从事电子硬件设计工作有十几年时光了,回忆起刚接触电子,感触很多……虽然经历了很多酸甜苦辣,但也给我的生活增添了很多色... 发表于 03-11 15:17 • 1333次 阅读 移植RT-Thread到新唐单片机的步骤教程 第一步,基于RTE创建工程,应选择下图的选项 第二步,工程应至少包含以下4个基本库文件 第三步,工程的配置 因为我们可... 发表于 03-11 14:07 • 1622次 阅读 单片机学习:关于P0和P2口的一些知识分享 学校为什么能存在,光靠看一本书就能自学成才,那还要学校有什么用,当然了,除了一些学习能力很强,且有一.... 发表于 03-11 13:34 • 14次 阅读 单片机学习:关于P0和P2口的一些知识分享 单片机原理I/O口结构:P0口和P2口的结构介绍 实话告诉你,除非学习能力很强,且很有自主学习能力的人,才适合自学这条路,如果不具备以上能力的,或者想.... 发表于 03-11 13:31 • 30次 阅读 单片机中的日志系统是如何实现的? 一、需求和概要实际项目中经常需要用到通过串口打印一些信息或保存日志信息到文件,从而知道程序的运行状态,这些日志信息有助于... 发表于 03-11 10:29 • 3003次 阅读 单片机中的日志系统是如何实现的? P3口的相关结构和功能的知识分享 所有人的大道理都懂,但是自己很难控制自己,自学时间上不容易把控,还是跟班学习好点,有人看着不学也得学.... 发表于 03-10 17:50 • 23次 阅读 P3口的相关结构和功能的知识分享 能用C++开发单片机吗 通常来说,在单片机上编程,要么汇编,要么C语言,而用C++进行开发的很少。 的头像 strongerHuang 发表于 03-10 17:47 • 808次 阅读 单片机没有串口时如何打印调试信息 输出调试信息是嵌入式开发中必不可少的调试利器,嵌入式开发的一个特点是很多时候没有操作系统,或者没有文.... 的头像 硬件攻城狮 发表于 03-10 17:19 • 531次 阅读 单片机没有串口时如何打印调试信息 单片机之裸机程序框架设计 大学导师教导过,学到的知识,时刻去保持分享。分享之前要去加深理解每一句话的含义。第一受益者是自己,第.... 发表于 03-10 16:43 • 12次 阅读 单片机之裸机程序框架设计 单片机应用系统的开发流程 我们学习单片机的目的就是为了进行嵌入式系统的开发,学好单片机首先要有一个整体认识。 的头像 strongerHuang 发表于 03-10 16:13 • 289次 阅读 2022FTF青少年无人机大赛赛事规则发布! 近日,WRC世界机器人大赛FTF青少年无人机赛项组委会发布了 2022(第五届)FTF青少年无人机大.... 的头像 创客火无人机 发表于 03-10 15:23 • 266次 阅读 2022FTF青少年无人机大赛赛事规则发布! NY8B062D 8位单片机数据手册 NY8B062D 8位单片机数据手册免费下载。 发表于 03-10 14:28 • 38次 阅读 如何快速排查IO异常输出问题 在嵌入式开发过程中,IO 操作是不可避免的,很多时候 IO 操作很正常,但有些时候可能因为某些原因导.... 的头像 strongerHuang 发表于 03-09 17:55 • 711次 阅读 如何快速排查IO异常输出问题 大资源MCU PY32F030的功能及其参数一览 PY32F030 系列微控制器采用高性能的 32 位 ARM® Cortex®-M0+内核,宽电压工.... 发表于 03-09 16:47 • 16次 阅读 AGM MCU IDE安装使用方法 AGM MCU使用自有的IDE编程调试环境,使用起来按步骤安装使用即可。 的头像 MCU/FPGA by AGM 发表于 03-09 15:07 • 266次 阅读 AGM MCU IDE安装使用方法 单片机学习:P3口的相关结构和功能介绍 之前的文章有分享过P2口,P1口和P0口的相关结构和功能,这一期分享就来说一说P3口的相关结构和功能.... 发表于 03-09 14:18 • 26次 阅读 单片机学习:P3口的相关结构和功能介绍 8位单片机九齐NY8A054E的产品概述 NY8A054E是以EPROM作为存储器的 8 位单片机,专为多组PWM的应用而设计。例如灯控,遥控.... 发表于 03-08 16:20 • 29次 阅读 单片机IO口结构,P1P2口相关内容讲解 单片机在输入功能的时候除了读引脚之外,还有一个功能叫做读锁存器,先使读锁存器信号有效,内部总线是1的.... 发表于 03-08 15:32 • 69次 阅读 单片机IO口结构,P1P2口相关内容讲解 半导体的应用领域都有哪些 光伏应用 半导体材料光生伏特效应是太阳能电池运行的基本原理。现阶段半导体材料的光伏应用已经成为一大热.... 发表于 03-08 15:13 • 40次 阅读 LABVIEW编程——表格程序 1.违反了数据流的原则,没有使用控件的端子进行数据传递,在没有任何必要的情况下使用了局部变量 2.初.... 发表于 03-08 14:02 • 8次 阅读 浅谈MCU内核架构发展历史 电子发烧友网报道(文/程文智、李宁远)目前,MCU已经渗透到我们生活的各个领域,几乎很难找到有哪个领.... 的头像 电子发烧友网 发表于 03-08 10:28 • 382次 阅读 低功耗远距离lora模块:射频无线收发器芯片的对比 1、产品简述 SX1278/6是Semtech公司在2013年推出的一款远距离、低功耗的无线收发器,.... 发表于 03-07 17:07 • 31次 阅读 低功耗远距离lora模块:射频无线收发器芯片的对比 分享一些单片机基础入门级的知识 很多在校的大学生或者在岗位想加深自己职业技能的人,都想通过学习单片机来补充自己,以便与不被社会淘汰,.... 发表于 03-07 14:18 • 69次 阅读 分享一些单片机基础入门级的知识 RTOS是什么,裸机开发的详细介绍 本课是在听了韦东山老师的裸机和RTOS开发模式课程后,才简单了解裸机开发与RTOS开发的区别。更多的.... 发表于 03-07 14:16 • 35次 阅读 RTOS是什么,裸机开发的详细介绍 单片机控制系统课程设计《基于单片机的大棚智能灌溉控制系统》 单片机控制系统课程设计《基于单片机的大棚智能灌溉控制系统》 发表于 03-07 10:37 • 57次 阅读 51单片机CPU的基本构成及作用 单片机是什么,是在一个集成硅片中集成了一些部件,构成了一个微型的计算机系统的东西,这些只是对单片机的.... 发表于 03-07 10:02 • 125次 阅读 51单片机CPU的基本构成及作用 51单片机一些关于CPU的理论知识 单片机刚开始执行程序的时候会给PC指针,叫做程序计算器,装入一个地址,也就是说我们ROM当中的第一条.... 发表于 03-04 16:17 • 72次 阅读 51单片机一些关于CPU的理论知识 如何自制属于自己的单片机开发板 什么是单片机的开发板,单片机的开发板主要是用来学习单片机,另外一方面是用来开发单片机相关项目的时候,.... 发表于 03-04 16:03 • 56次 阅读 如何自制属于自己的单片机开发板 ATS2835相关功能及应用领域的介绍 ATS2835目前国内芯片首创CSB功能,是Connectionless Slave Broadca.... 发表于 03-04 15:19 • 29次 阅读 详解单片机的基本知识 单片机是一种集成电路芯片,其内部采用了超大规模集成电路把具有数据处理能力的中央处理器CPU,随机读取.... 的头像 互联网电子设计 发表于 03-04 09:46 • 393次 阅读 详解单片机的基本知识


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3