问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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

创作时间:
作者:
@小白创作中心

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

引用
CSDN
1.
https://m.blog.csdn.net/weixin_43982452/article/details/139304654

在单片机开发中,编写高效的代码不仅能提升程序性能,还能降低成本。本文从位操作、数据类型选择、算法优化等多个维度,分享了实用的代码优化技巧,帮助开发者写出更精良的嵌入式程序。

单片机的程序比软件开发要少一些,但真正想编写出高效的代码,还是需要积累很多年的经验。在做研发工程师的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-=1i++i+=1去替代i = i-1i=i+1的操作,有些编译器对前者进行了优化,效率更高。

7. 优化算法

以计算1到100的和为例。我们可能会首先想到使用循环来写程序:

int sum = 0;
for (int i = 1; i <= 100; i++) {
    sum += i;
}

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

那怎么去优化?这时候就要考验工程师的数学功底了。可以根据等差数列求和公式,1到100的和可以表示为:

将这个公式应用到代码中:

int n = 100;
int sum = (1 + n) * n / 2;

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

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

在编写单片机代码时,尽量通过数学方法,或其他算法技巧,提高程序的执行效率。这不仅可以减少了CPU的计算时间,还能减少程序占用的内存空间,从而提高整体性能。

插个题外话,之前很多老铁问我,数学不好,可以学单片机吗?我觉得这就是一个很好的例子,数学不是门槛,而是天花板。第一种实现方式,是小学算数水平,但效率低。第二种,则需要一定的数学能力,但效率高。那同样都能实现功能,效率低点就低点呗,有什么所谓?其实这个会间接影响到硬件成本。比如数学功底好的,可以用低端单片机去实现功能,而数学功底不好的,写出来代码效率低,则需要性能更强的单片机支撑。不过,很多产品,对效率的要求并没这么苛刻,哪怕用第一种方式,照样没问题。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号