C语言在嵌入式领域凭借着高效与简单的特点成为了一门与底层非常亲近的语言,当时由于嵌入式领域相比计算机领域硬件资源上是非常受限的,比如主频比较低、内存小等等。

这样就对嵌入式软件就有了新的要求,务必要写出高效、简洁、可移植性强的代码,大家可能会想到编译器直接优化,其实C编译器为其提供的优化技术仅能做到速度和代码量的平衡,而无法实现提高代码运行效率和促进代码执行效率。

所以小哥总结了一些自己平时在编码过程中的一些方法与措施。

1、位运算替代乘除

位运算是C语言中的最小数据单元,移位运算或位处理基本上是每个MCU或者处理器的指令集中直接支持的,所以C代码编译成汇编以后基本上简单的几条汇编指令即可完成运算。

然而对于乘除法CPU一般无法直接运行,当然现在高端的芯片一般支持FPU等等之类的处理,相对而言速度得到了显著提升;但是大部分还是会比移位运算处理耗时,特别是有些编译器直接把乘除法编译成函数调用来处理。

所以像n/8这样的处理直接使用n>>3即可替代,这样效率会更高。

2、变量的使用

使用全局变量相对局部变量效率更高,函数的局部变量一般处于函数内部,在调用过程中存在入栈与出栈的情况,这样就增加了函数调用的耗时,而全局变量直接访问效率更高。

当然全局变量是程序中要非常小心使用的,滥用全局变量的行为确实会增加系统各模块之间的耦合,所以在程序中要规范全局的统一接口使用。

同时对于变量类型的使用也是大家需要注意的,数据类型不是越大越好,比如uint64_t的处理汇编生成代码就相对比较多,执行效率一般比短数据类型要低,尽量选择芯片相同位数的数据类型处理,当然大部分更小的数据长度也是合适的。

3、指针替代数组

相对数组索引,指针运算效率更快,数组是一片连续的内存空间,那么通过指针移动进行数组数据的索引也是合适的。

比如我们遍历数组array[i],任意一次的循环都需要对其进行下标 “ i ” 值的标记与计算,而当指针“p”位于array数组位置的时候,循环仅只需要对“p”进行增量的操作,这样指针耗时会比数组访问小很多。

4、算法优化

一些数据的处理明明可以通过更加简洁的算法,可是大部分程序员非要以最傻瓜的方式进行运算,最容易理解的就是高斯求和,1~100累加,还是选择高斯求和算法,当然还有很多算法有多种形式,各有优劣,根据自身需求进行合理选择。

特别是一些应用根本没有必要用使用高精度耗时的数据处理算法,选择一些低精度快速的算法更加合适。

5、优化分支语句

我们都知道if-else语句是最常用的分支语句,其特点就是逐一判断,既然是判断就会消耗时间,然而对于一些处理并不是每个分支都是均匀执行的,如果你把频繁执行的相应分支放到后面,势必就需要执行较多前面的逐一判断,从而降低代码执行效率。

所以我们要对各个分支的执行频率进行评估,把最有可能执行的放在判断语句前面执行。

同样对于分支语句多级嵌套的情况,我们需要把频率性对较高的放到外层,频率低的放内层,这样减少不必要的外层判断。

6、循环语句的优化

在系统的多重循环过程中,需要程序员将最长的循环内容设置在系统的最内层,同时需要将最短的循环内容设置在系统的最外层。

这样,能够有效提升CPU的运行效率,减少循环次数。另外,如果在系统的循环过程中需要进行逻辑判断,且循环的次数相对较大,就需要将循环判断从系统内部转移到系统的外部。

7、无敌" 宏 "的利用

宏在C语言中是灵活度非常高的语法特性,宏代码片段的使用其代码表现形式上与函数差异并不是很大,大伙有学习C++语言模板的经验,应该会觉得两者有颇多相似之处。

在对函数进行调用的过程中,需要通过栈对其进行储存,而且CPU在函数调用的过程中还要做好对数据的恢复准备,有效进行出栈和进栈的操作。所以占用CPU时间除了代码本身之外,对函数进行调用也需要占据一定的时间。

而宏就能节省参数压栈、返回参数、C语言call调用以及执行return的操作步骤,从而提高程序的运行效率。

最后

总结了一下嵌入式C语言代码优化的一些经验,当然对于代码的优化也不能盲目的牺牲代码可读性等,所以科学合理的优化才是终极之法。

C语言提高代码效率的几种方法,7个提升嵌入式C代码效率的方法-嵌入式系统-与非网...相关推荐

  1. c语言转fpga原理,要想玩转FPGA,就必须理解FPGA内部的工作原理-可编程逻辑-与非网...

    FPGA(Field-Program mable Gate Array),即现场可编程门阵列,它是在 PAL.GAL.CPLD 等可编程器件的基础上进一步发展的产物.它是作为专用集成电路(ASIC)领 ...

  2. stm32c语言设计以及注释,13个基于STM32的经典项目设计实例,全套资料~-嵌入式系统-与非网...

    STM32单片机现已火遍大江南北,各种教程资料也是遍布各大网站论坛,可谓一抓一大把,但大部分都差不多.今天总结了几篇电路城上关于STM32 的制作,不能说每篇都是经典,但都是在其他地方找不到的,很有学 ...

  3. python 读取txt文件没读到400行_400行Python代码实现文语处理助手(3) - 音频显示-嵌入式系统-与非网...

    音频显示是 pzh-py-speech 的主要功能,pzh-py-speech 借助的是 Matplotlib 以及 NumPy 来实现的音频显示功能,今天痞子衡为大家介绍音频显示在 pzh-py-s ...

  4. c语言检测正弦波波峰波谷,一种基于波峰波谷检测的计步算法的制作方法

    本发明涉及计步器算法领域,具体是一种基于波峰波谷检测的计步算法. 背景技术: 当今社会,健康越来越受到人们的重视,步行作为人类活动中最基础.最常见.最重要的运动形式,使得深入研究计步算法有着重要的意义 ...

  5. 超实用干货:这6个好方法,瞬间提升你的工作效率

    话不多说,直接上菜. 习惯打腹稿,列提纲 动手做事前,先把整个事情的框架步骤在脑海里过一遍,这就是打腹稿. 做事不打腹稿就立即行动的人,看似执行力很强,实则思路混乱,浪费的时间更多. 正确的做事方法, ...

  6. 嵌入式c语言开发闹钟,DIY小设计:智能闹钟的简单软硬件实现-嵌入式系统-与非网...

    一.项目概述 1.1 引言 你还在为早上闹钟叫不醒你而发愁吗?你还在为早上突然的闹铃声而烦吗?你还在为早上睁开眼睛时刺眼的灯光而伤脑筋吗?你还在为早上忘记重要事情不愿起床耽误行程而后悔吗?我们团队设计 ...

  7. arm clz指令c语言,协处理器及其他指令之:零计数指令CLZ-嵌入式系统-与非网

    9.3  零计数指令CLZ ARMv5及其以上版本提供了一条新的指令--零计数指令CLZ(Count Leading Zeros).该指令用于计算最高符号位与第一个1之间的0的个数.当一些操作数需要规 ...

  8. c 调用c语言头文件,混合使用C、C++和汇编语之:在C++中使用C头文件-嵌入式系统-与非网...

    12.3  在C++中使用C头文件 本节描述如何在C++代码中使用C头文件.从C++调用C头文件之前,C头文件必须包含在extern "C"命令中.本节包含以下两部分内容: ·   ...

  9. 代码整理工具_整理了 11 个好用的代码质量审核和管理工具

    点击上方"Python编程时光",选择"加为星标" 第一时间关注Python技术干货! 来源:云智时代 https://www.toutiao.com/i677 ...

最新文章

  1. 高性能MySQL之架构与历史(1)
  2. 揭秘7大AI学习板块,这个星球推荐你拥有
  3. 位置模拟服务器超时,调用别人提供的服务的时候没有设置超时程序被卡住了怎么办?,如何模拟超时的情况?...
  4. 2021年深度学习哪些方向比较新颖,处于上升期或者朝阳阶段,比较有研究潜力?
  5. radvd移植到arm交叉编译问题解决
  6. redisson笔记
  7. Android音频基础知识
  8. pc套件 无法连接pc CDC Comms Interface
  9. swagger 常用注解
  10. After 500:写500篇博客其实和写一篇是一样的
  11. 删除的文件怎么恢复?
  12. Lesson 12 Goodbye and good luck 再见,一路顺风
  13. 业余10—解决只能打开网页不能打开QQ或视频软件问题
  14. k8s 1.23.1部署gitlab、 gitlab-runn配置k8s集群编写.gitlab-ci.yml实现根据tag,分支发布CICD流程
  15. [原创]简易文本编辑器( 无界面)
  16. Zhong__Centos8安装docker
  17. Python视觉摄像头检测有趣项目之机器学习和概率论重点概念分析重要(三)(重点)
  18. Struts2学习之------Struts2的详细的复习讲解
  19. Lucene Query Parser Syntax
  20. SQL更新(INSERT,UPDATE,DELETE)语句的一般格式及注意事项

热门文章

  1. [Boston Legal][S02E02]Allan Shore在Kelly Nolan被控杀夫一案中的结案陈词
  2. Word2003快速操作技巧及常用快捷键使用
  3. 洛谷 1282 多米诺骨牌#线性动态规划#
  4. 工业机器人(9)-- Matlab机器人工具箱之创建单臂/双臂机器人SDH/MDH方法
  5. 数据分析之numpy基础/matplotlib绘图/numpy常用函数/杂项功能
  6. 程序员如何优雅记笔记(Wiki、Typora、Markdown、坚果云)
  7. CentOS 部署 NodeBB
  8. Halcon实例分析——check_blister.hdev
  9. 是谁送给秦羽73件鸿蒙,《星辰变》秦羽的6个身份,第一个弱爆了,最后一个大反转...
  10. Android之手机卫士涉及的知识点总结