如何编写高效的单片机代码?

单片机的程序比软开少一些,真正想编写出高效的代码,还是要积累很多年的。

在做研发工程师的10年里,我经历过几个公司,看过很多工程师写的代码,但真正能让我跪着看完的,极少。哪怕是大厂工程师,也会有让人笑掉大牙的代码。

高效的背后,有很多学问,需要有一定的数学功底,对编译器有较深的了解,懂汇编

具备这些能力,写出来的代码,才能让cpu执行这段代码所花费的时间,以及占用的ROM和RAM资源更少。

然而,如果把项目每个细节,都优化到高效的程度,花费的时间,是平时的两倍。

所以,我们在做项目时,一般只优化核心功能,才能赶上项目的进度,除非经验相当丰富。

下面分享几点高效代码的技巧:

1.使用位操作代替算术操作,因为位操作更快。

还有就是用左移、右移替代乘除法。

比如a=b*256,可以改成a = b<<8

比如a=b/256,可以改成a = b>>8

2.避免不必要的操作

去除代码中不必要的操作,如多余的变量赋值、函数调用等。

3.控制数据类型大小

特别是尽量别用float,浮点运算通常需要更多的CPU周期和内存空间,因为浮点数的表示和运算比整数复杂,除非单片机内置了硬件浮点单元(FPU)。

能用unsigned就不用signed,无符号整数的运算可能比有符号整数更快,因为不需要处理符号位。

能用char就不用int,较小的数据类型在处理和传输时更快,因为它们占用的内存和带宽更少。特别对于存储大量数据的数组或缓冲区,使用 char 类型可以显著减少内存占用。

4.利用硬件资源

比如说STM32单片机,可以利用DMA传输数据,减少CPU负载。

5.代码重用

一些重复的代码,通过函数或宏来重用代码。

6.自加、自减指令

用i--、i-=1、i++、i+=1、去替代i = i-1,i=i+1的操作,有些编译器对前者进行了优化,效率更高。

7.优化算法

以计算1到100的和为例。

我们可能会首先想到使用循环,来写程序:

这种方法虽然直观,但在效率上可能不是最优的。

那怎么去优化?

这时候就要考验工程师的数学功底了。

可以根据等差数列求和公式,1到100的和可以表示为:

n是序列的最后一项,即100。将这个公式应用到代码中:

对以上两种实现代码的总结:

尽管程序都能得到相同的结果,但是第二种方法在运行效率上明显优于第一种。因为它避免了循环的开销,直接通过数学公式计算出结果。

在编写单片机代码时,尽量通过数学方法,或其他算法技巧,提高程序的执行效率。

这不仅可以减少了CPU的计算时间,还能减少程序占用的内存空间,从而提高整体性能。

插个题外话,之前很多老铁问我,数学不好,可以学单片机吗?

我觉得这就是一个很好的例子,数学不是门槛,而是天花板。

第一种实现方式,是小学算数低,但效率低。

第二种,则需要一定的数学能力,但效率高。

那同样都能实现功能,效率低点就低点呗,有什么所谓?

其实这个会间接影响到硬件成本。

比如数学功底好的,可以用低端单片机去实现功能,而数学功底不好的,写出来代码效率低,则需要性能更强的单片机支撑。

不过,很多产品,对效率的要求并没这么苛刻,哪怕用第一种方式,照样没问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/19006.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详解 Spark 的运行架构

一、核心组件 1. Driver Spark 驱动器节点&#xff0c;用于执行 Spark 任务中的 main 方法&#xff0c;负责实际代码的执行工作主要负责&#xff1a; 将用户程序转化为作业 (job)在 Executor 之间调度任务 (task)跟踪 Executor 的执行情况通过 UI 展示查询运行情况 2. Exec…

centos8系统如何安装宝塔面板

我这边购买了一台Hostease的VPS云主机产品&#xff0c;想要安装宝塔面板&#xff0c;但是我这边是安装时遇到错误&#xff0c;如图&#xff1a; 这边尝试检查了似乎时yum 有问题&#xff0c; 无法通过yum 安装。因此联系了Hostease技术人员帮助&#xff0c;他们告知自2022年1月…

详解Spring IoCDI(一)

目录 1.什么是IoC 2.IoC应用场景&#xff08;案例分析&#xff09; 2.1传统程序开发 2.2问题分析 2.3解决方案 2.4IoC 优势 3. DI概念 4.IoC详解 4.1Bean的存储 4.2Controller&#xff08;控制器存储&#xff09; 4.3获取Bean 4.4Bean相关注解 1.什么是IoC Spring…

统计计算五|MCMC( Markov Chain Monte Carlo)

系列文章目录 统计计算一|非线性方程的求解 统计计算二|EM算法&#xff08;Expectation-Maximization Algorithm&#xff0c;期望最大化算法&#xff09; 统计计算三|Cases for EM 统计计算四|蒙特卡罗方法&#xff08;Monte Carlo Method&#xff09; 文章目录 系列文章目录一…

echarts性能优化

echarts数据量多的时候优化方案&#xff1a; 渲染的数据太多时&#xff0c;渲染的速度会变慢。 let data [];for (let i 0; i < 100000; i) {let style {};if (i % 2 0) {style.color "red";}data.push({value: i,itemStyle: style,}); } myEcharts init(c…

STM32-13-MPU

STM32-01-认识单片机 STM32-02-基础知识 STM32-03-HAL库 STM32-04-时钟树 STM32-05-SYSTEM文件夹 STM32-06-GPIO STM32-07-外部中断 STM32-08-串口 STM32-09-IWDG和WWDG STM32-10-定时器 STM32-11-电容触摸按键 STM32-12-OLED模块 文章目录 STM32-12-MPU1. 内存保护单元MPU1. M…

交换机的三层交换技术

现有pc1与pc2不在同一个网段之下&#xff0c;通过交换机相连接。 进人交换机1&#xff0c;创建两个vlan 10和vlan 20 &#xff0c;进入串口2设置串口模式为access&#xff0c;并且设置默认vlan为10.进入串口3设置串口模式为access&#xff0c;并且设置默认vlan为20. 进入串口1…

深度解析搜索引擎广告(SEM)与社交媒体广告(SMM):NetFarmer助力企业数字化出海

在当今数字化时代&#xff0c;企业出海已经成为了一个必然趋势。然而&#xff0c;如何有效地在海外市场中推广品牌、吸引潜在客户&#xff0c;成为了众多企业面临的重要挑战。搜索引擎广告&#xff08;SEM&#xff09;和社交媒体广告&#xff08;SMM&#xff09;作为两种主要的…

python pyinstaller 打包后运行找不到模块

现象 在命令行中可以运行&#xff0c;但是pyinstaller 打包后运行找不到模块 原因及解决方案 pyinstaller 找错库了&#xff0c;可以在打包时指定库 pyinstaller -F -w app.py -p <xxxx/site-packages> 生层次问题 通过python -m site 查看USER_SITE的库和sys.path…

儿童股骨干骨折用儿童悬吊如何进行康复

儿童股骨干骨折后的悬吊康复训练&#xff0c;应根据骨折的具体情况和儿童的年龄来制定个性化的康复计划。悬吊康复训练主要目的是通过减轻骨折部位的压力&#xff0c;促进骨折愈合&#xff0c;同时保持和增强儿童的肌肉力量和关节活动能力。 悬吊康复训练的方法 1.垂直悬吊皮牵…

Linux内存管理(七十二):Linux PSI 原理更新(v5.15)

源码基于&#xff1a;Linux 5.15 约定&#xff1a; 芯片架构&#xff1a;ARM64内存架构&#xff1a;UMACONFIG_ARM64_VA_BITS&#xff1a;39CONFIG_ARM64_PAGE_SHIFT&#xff1a;12CONFIG_PGTABLE_LEVELS &#xff1a;3 0. 前言 本文是在之前《PSI 详解 v5.4》一文基础上&…

如何下载b站(哔哩哔哩bilibili)的学习视频教程

方法1&#xff1a; 打开粘贴视频链接下载即可哔哩哔哩(bilibili)视频解析下载 - 保存B站视频到手机、电脑哔哩哔哩高清视频解析下载工具是一个免费的B站视频在线解析提取工具,支持提取B站APP和bilibili网站上的任何视频,提取出来的视频无水印.我们可以借助此下载器方便地将视频…

最大公约数和最小公倍数(函数)(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//声明函数&#xff1b; //最大公约数&#xff1b; int greatdivisor(int x, int y);//最小公倍数&#xff1b; int leastmultiple(int x, int y);int main() {/…

operator <=> (spaceship operator)

1. C20 前如何定义比较运算符 C20 之前&#xff0c;必须为一个类型定义六个操作符&#xff0c;以提供对象所有比较的支持。 例如&#xff0c;若要比较Value 类型的对象(具有整型ID)&#xff0c;则须实现以下操作: class Value { private:long id;...public:...// equality op…

618精选编程书单:学好代码是用好大模型的基础

大家好&#xff0c;我是爱编程的喵喵。双985硕士毕业&#xff0c;现担任全栈工程师一职&#xff0c;热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

如何选择适合自己需求的云服务器

最近明月接了一个跨境电商的代维业务&#xff0c;发现他们的云服务器很有代表性&#xff0c;今天就以此为例给大家分享一下应该如何选择适合自己需求的云服务器。像明月这样专做代维业务的可以说什么云服务器都体验过了&#xff0c;也发现大家在选择自己的云服务器的时候有很大…

媒体查询检查设备特性的条件表达式的简单应用

一、media (max-width: 768px) 当屏幕宽度小于或等于768像素时&#xff0c;设置指定的CSS样式。 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wi…

加密资产私钥安全完整手册(一) ,bitget钱包为例

比特币和以太坊等加密货币的兴起开创了数字金融的新时代&#xff0c;但也带来了独特的安全挑战。这些代表现实世界价值的数字资产已成为黑客和窃贼的主要目标。为了安全地应对这种情况&#xff0c;了解私钥的基本概念至关重要。 私钥是加密货币所有权和安全性的基石。它们相当于…

VSCode小技巧,忽略不想格式化的代码行

零&#xff0e;格式化工具文档 1 . Black Ignoring sections功能 2 . autopep8 disabling-line-by-line功能&#xff1b;&#xff1b;–line-range选项 3 . Prettier prettier-ignore功能(例&#xff1a;适用于JS的// prettier-ignore&#xff0c;适用于CSS的/* prettier-igno…

HTML新春烟花盛宴

目录 写在前面 烟花盛宴 完整代码 修改文字