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

这样就对嵌入式软件就有了新的要求,务必要写出高效、简洁、可移植性强的代码,大家可能会想到编译器直接优化,其实C编译器为其提供的优化技术仅能做到速度和代码量的平衡,而无法实现提高代码运行效率和促进代码执行效率。所以小哥总结了一些自己平时在编码过程中的一些方法与措施。

1位运算替代乘除

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

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

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

2变量的使用

使用全局变量相对局部变量效率更高,函数的局部变量一般处于函数内部,在调用过程中存在入栈与出栈的情况,这样就增加了函数调用的耗时,而全局变量直接访问效率更高。当然全局变量是程序中要非常小心使用的,滥用全局变量的行为确实会增加系统各模块之间的耦合,所以在程序中要规范全局的统一接口使用。同时对于变量类型的使用也是大家需要注意的,数据类型不是越大越好,比如uint64_t的处理汇编生成代码就相对比较多,执行效率一般比短数据类型要低,尽量选择芯片相同位数的数据类型处理,当然大部分更小的数据长度也是合适的。

3指针替代数组

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

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

4算法优化

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

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

5优化分支语句

我们都知道if-else语句是最常用的分支语句,其特点就是逐一判断,既然是判断就会消耗时间,然而对于一些处理并不是每个分支都是均匀执行的,如果你把频繁执行的相应分支放到后面,势必就需要执行较多前面的逐一判断,从而降低代码执行效率。所以我们要对各个分支的执行频率进行评估,把最有可能执行的放在判断语句前面执行。同样对于分支语句多级嵌套的情况,我们需要把频率性对较高的放到外层,频率低的放内层,这样减少不必要的外层判断。

6循环语句的优化

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

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

7无敌" 宏 "的利用

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

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

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

2最后

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

c语言stdoux串口流,嵌入式C语言代码优化的一些经验相关推荐

  1. 串口调试助手c语言程序,串口调试助手C语言源程序

    串口调试助手C语言源程序 串口调试助手源程序 及编程详细过程 作者:龚建伟 2001.6.20 可以任意转载,但必须注明作者和说明来自http://doc.xuehai.net,不得作为商用 目次: ...

  2. c语言里变量列表,嵌入式C语言里的土豪们之变量类型

    嵌入式C语言里的土豪们之变量类型本文引用地址:http://www.eepw.com.cn/article/184332.htm 上一篇我们谈到了运算奢华大户除法(详见<嵌入式C语言里的土豪们之 ...

  3. c语言编码风格,讲嵌入式C语言编码风格.ppt

    讲嵌入式C语言编码风格 目 录 简介及说明 语言规则 1.基础 2.数据 3.说明与表达式 4.函数 5.内存及资源 6.源文件 风格指导 7.程序书写 8.命名 9.文档 简介及说明 正确性 易维护 ...

  4. c语言单片机串口通讯,单片机C语言之串口通信协议

    串口通信概述 串口通信指串口按位(bit)发送和接收字节.尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据. 常用三种串口通信协议 1.RS-232 RS ...

  5. linux c与c语言的区别吗,嵌入式c语言与c语言的区别

    原标题:嵌入式c语言与c语言的区别 最广泛使用的系统编程语言是C语言,它是使用自由格式源代码的简单编程语言:它曾用于以前用汇编语言构建的应用程序中.嵌入式C是C语言的扩展,它在嵌入式系统中应用于编写嵌 ...

  6. c语言指针尚观嵌入式,C语言-指针

    本文目录 •直接引用 •一.什么是指针? •二.指针的定义 •三.指针的初始化 •四.指针运算符 •五.指针的用途举例 •六.关于指针的疑问 指针是C语言中非常重要的数据类型,如果你说C语言中除了指针 ...

  7. 嵌入式c语言汇编混合编程,嵌入式C语言和汇编语言的混合编程

    此文章简单介绍 单片机 C语言和汇编语言混合编程的例子.主要用单片机汇编语言编写DS1302的底层驱动,在C语言里通过调用汇编语言,从而实现C和汇编的混合编程. ;汇编语言源文件 ;========= ...

  8. c语言 465串口编程,用C语言编写串口程序

    在当今,流行的编程软件种类繁多,它们编程方便.易于维护,但是在与硬 件直接打交道和编制系统软件时却束手无策,于是C语言就有了用武之地.C语言 作为汇编语言与高级语言之间的一种过渡语言,兼有汇编语言的高 ...

  9. uml+oopc嵌入式c语言开发精讲_当前火爆的嵌入式领域,为什么选择C语言作为开发语言?了解一下...

    C语言和嵌入式C编程有什么区别?其区别在于嵌入式的C语言是跑在嵌入式的开发板上的,CPU和电脑不一样,所以编译器也是不一样的,生成的可执行程序也是不一样的.选择嵌入式开发语言归结于嵌入式系统开发的特点 ...

最新文章

  1. https://www.exploit-db.com/能够成功下载的一个CVE编号
  2. 为什么大公司一定要使用DevOps?
  3. cogs 539. 牛棚的灯
  4. java 左边补0_java基础知识
  5. 反思赚钱:一定要动脑子 一定找发财点
  6. MongoDB学习使用
  7. 远程桌面服务器office版本,在启用远程桌面服务的计算机上部署 Office 2010
  8. 液压减振器 matlab,摩托车液压减振器内泄漏对阻尼力影响计算及其对策
  9. Linux C++ socket编程实例
  10. 国内电波钟和石英钟表相比有何优势?
  11. Noteability和GoodNotes日常使用细节对比
  12. 邦邦两拳‾͟͟͞(((ꎤˋ⁻̫ˊ)—̳͟͞͞o
  13. MPL2.0协议简介——Mozilla Public License Version 2.0
  14. Intel Quiet System Technology (QST) Support In ...
  15. Android获取重力加速度和磁场强度
  16. 微米纳米机器人 课件_微纳米机器人
  17. GPRS模块(SIM900A)在QT下的通信例程
  18. 客户体验改善计划_改善媒体体验
  19. AARRR模型——激活:获客红海背后的蓝海(下)
  20. 从NeRF到Plenoxels学习 透明度 体积渲染方程

热门文章

  1. 二次规划问题的KKT 条件求解方法
  2. 安卓手机下拉状态栏的代码实现
  3. 【MySQL存储过程】光标的使用详解
  4. 深度学习水果识别系统-python
  5. 解决:浏览器下载的Excel文件显示“文件已损坏,无法打开”
  6. 系统性思考-思考习惯的养成
  7. 最小二乘估计,矩阵求导法(正规方程)全推导
  8. 在ARM板子上把玩Tensorflow Lite
  9. IEEE-754单精度浮点类型详解(完结篇)
  10. 徐宗本院士讲座《关于大数据研究下的若干问题》摘记