开源嵌入式编译器,没想象中那么好?

发布者:EEWorld资讯最新更新时间:2024-09-09 来源: EEWORLD作者: 付斌关键字:编译器  嵌入式  C语言 手机看文章 扫描二维码
随时随地手机看文章

工欲善其事,必先利其器,对嵌入式工程师来说,嵌入式编译器是不可或缺的神兵利器,它被人冠以“C语言翻译官”的名号。 由于C语言历史悠久,早期没有规范,整个计算机产业也都处于拓荒的年代,所以就涌现了很多款C语言编译器。


根据EEWorld的调研,嵌入式工程师比较青睐的嵌入式编译器主要包括Keil(ArmCC)、IAR、GCC、AVR GCC、CLion、Clang、green hills、TI的CSS、ADI的Visual DSP++。不过,随着嵌入式开发格局逐渐稳固,Keil、IAR、GCC成为嵌入式编译器三巨头,基本大部分嵌入式产品都有其身影。


尤其是GCC,作为一个完全开源的编译器,很多MCU厂商的IDE都由它改写而来。但最近一段时间,业界出现不同的声音,表示“开源才是最贵的”,这些编译器在开源背后潜藏许多隐形成本。


跑RTOS,GCC没打过IAR


现如今,“C/C++与RTOS结合使用”是嵌入式软件开发的黄金范式,所以在嵌入式领域,判别编译器好不好用,那一定是在RTOS上好用。


根据著名嵌入式Jacob Beningo的测试,使用IAR编译时,RTOS指标性能比使用GCC编译时要好得多。根据公制测试,结果略有不同,但通常要好20~40%。以其中一个示例结果为例,该示例将IAR指标结果除以 ThreadX(Eclipse ThreadX)的GCC指标结果。


  • RTOS测试      ThreadX

  • 基准测试        74%

  • 协同调度        3%

  • 内存分配测试  28%

  • 消息处理        41%

  • 抢占式调度     19%

  • 同步处理        32%


也许会有人说,编写代码的质量决定了性能好坏。这句话确实没错,人们可以花费大把时间,细致地优化代码,但这不意味着开发时间更长,开发成本更高?


比如说,一些IoT项目工期比较短,有时候如果没有来得及去优化,那可能GCC处理时间会增加20%,并且让电池更费电。又或者,GCC编译的代码可能体积也会更大,这时候,内存从120MHz就需要变相升级到200MHz,这几块钱的差距,就会让产品成本大幅度增加。


GCC的确是行业一个福音,但相比商业编译器,也许它本身也存在一定额外的隐形开销。看目前RTOS抑或是开源RTOS本身也是附带工具链的,大部分则只支持GCC,却不支持商业编译器IAR,这种情况导致客户选择面变窄。


Keil比GCC编译文件,更小


虽然Keil目前已经包括五种版本,其中不乏全免费的教育版,而且STM32之类的MCU使用Keil也是免费的,但如果做一些很深入的开发工作,Keil本身还是需要付费的。所以它实质上还是算在商业编译器范畴内。


在工程师群里,很多人都提到一个话题,就是Keil的ArmCC编译器很神。那么实际情况如何呢?


根据工程师的测试,可以得知,GCC的编译速度最快(Keil和VisualGDB都开启多线程编译的)。而bin体积最小的是ArmCC V5。代码的执行效率没有测。


而ArmCC V5和V6对比,编译用时差异不大,手动掐表可以认为是误差范围内。但是bin体积 V5比V6小很多。



优化选项

O0

O1

O2

O3

Ofast

Os

Oz

ARMCC  V6.9

bin大小(KB)

131.13

90.03

95.54

98.54

97.45

87.84kB

85.47

编译用时(秒)

7.23

7.52

7.99

8.3

8.4

8.17

7.64

ARMCC  V5.06

bin大小(KB)

77.18

64.49

61.19

61.44

- -

- -

- -

编译用时(秒)

7.93

8.25

8.15

9.68

- -

- -

- -

GCC  7.2

bin大小(KB)

176

135

136

144

- -

129

- -

编译用时(秒)

3.49

3.63

3.68

4.12

- -

3.96

- -


为什么有时候会出现文件大小区别的情况?有工程师也曾经遇到过GCC编译bin文件比ArmCC大的情况,通过捋顺代码,发现有些原厂本身做了一些优化工作,所以实际上这本身也就节省了工程师优化的时间。


也有工程师表示,Keil有Keil的优势,GCC有GCC的优势,二者大多数情况下不可兼得;Keil(ArmCC)编译对Arm芯片有天然的优势,无论从代码性能和代码尺寸都有更佳的表现;GCC优势在于开源,利于折腾。


也有工程师在m0上做了实验,使用同样的代码触发pendsv中断,ArmCC响应时间为68clocks,gcc响应时间为78clocks。他表示,虽然ArmCC不开源、不免费、不可控,但是它会更代码执行效率更高。


ArmCC中断响应汇编

GCC中断响应汇编


用谁,工程师各持己见


萝卜青菜各有所爱,不论如何测试,工程师总是有自己的偏好。因为公司需求不同,对于Flash、执行速度、交付等要求不同,使用不同编译器都有不同的结果。


喜欢Keil的,在实际体验中,ac6的Osize优化特别猛,性能稍微弱一丢丢,但是体积特别小,其它编译器都比不过,同样的程序比gcc能小四分之一。但它让人又爱又恨,就比如MDK AC6曾经出现过调试到处乱跳的问题,不过商业版本有所改善,或者说MDK经常把if-else结构优化成IT汇编指令,在反汇编窗口中打的断点都命中了实际确不会执行。很多人表示,习惯了。


有人更喜欢用IAR,IAR不仅比Keil便宜很多,而且还内置了misra静态检查工具,很方便。


有传统GCC派,gdb调试Vscode编辑,在Linux系统下编译很香,有些老板不在意Flash的情况下,可以有最快的交付速度。也有Clion、Clang之类的新派。


那么,你怎么看待不同编译器之间的差异问题,你又会选用什么编译器?

关键字:编译器  嵌入式  C语言 引用地址:开源嵌入式编译器,没想象中那么好?

上一篇:安全编码技术:提高嵌入式应用代码安全性与可靠性
下一篇:Arm 为无处不在的 AI 奠定技术基础

推荐阅读最新更新时间:2024-11-12 07:40

基于嵌入式Linux系统的键盘驱动实现
1前 言 Linux由于其具有内核强大且稳定,易于扩展和裁减,丰富的硬件支持等诸多优点,在嵌入式系统中得到了广泛的应用。很多嵌入式Linux系统,特别是一些具有与用户强交互的嵌入式系统,往往需要配备一个特殊键盘,此时开发者需要根据实际情况,为自己的特殊键盘编写驱动程序。 2Linux键盘驱动简介 iframe id="iframeu2163852_0" src="http://pos.baidu.com/ncom?conwid=250&conhei=250&rdid=2163852&dc=3&di=u2163852&dri=0&dis=0&dai=4&ps=848x824&enu=encoding&dcb=__
[单片机]
I2C总线驱动在嵌入式系统中的两种实现
1 引 言 I2C总线(Inter-IC Bus)是一种通用的串行总线,是用于IC器件之间连接的二线制总线。他通过串行数据线(Serial Data Lines,SDL)及串行时钟线(Serial ClockLine,SCL)两线在连接到总线上的器件之间传送信息,并根据地址识别每个器件。一个或多个微控制器以及外围器件可以通过I2C总线接口非常方便的连接在一起构成系统。这种总线结构的连线和连接引脚少,器件间总线简单。结构紧凑,因此其构成系统的成本较低;并且在总线上增加器件不会影响系统的正常工作,所有的I。C器件共用一套总线,因此其系统修改和可扩展性好。即使有不同时钟速度的器件连接到总线上,时间同步机制也能够很方便地确定总线时钟,
[单片机]
I2C总线驱动在<font color='red'>嵌入式</font>系统中的两种实现
用 AWTK 和 AWPLC 快速开发嵌入式应用程序 (3)- 定时器
AWPLC 是 ZLG 自主研发的 PLC 系统(兼容 IEC61131-3),本文用一个用定时器实现的走马灯程序,来演示如何用 AWTK 和 AWPLC 快速开发嵌入式应用程序。 背景 AWTK 全称 Toolkit AnyWhere,是 ZLG 开发的开源 GUI 引擎,旨在为嵌入式系统、WEB、各种小程序、手机和 PC 打造的通用 GUI 引擎,为用户提供一个功能强大、高效可靠、简单易用、可轻松做出炫酷效果的 GUI 引擎。 AWPLC 是 ZLG 自主研发的 PLC 系统(兼容 IEC61131-3),其中 AWPLC 的运行时库 (Runtime) 基于 ZLG TKC 开发,可以移植到到任何主流 RTO
[工业控制]
用 AWTK 和 AWPLC 快速开发<font color='red'>嵌入式</font>应用程序 (3)- 定时器
如何将多个C语言模块组合成一个程序
C语言的基本组成单元是函数,各个函数之间可以相互引用。在学到静态函数有时又将为内部函数和外部函数,即分别用static和extern说明的函数时,有不少人感到很迷惑: 外部 和 内部 到底是怎么一回事呢? 一般来说,我们编制的C语言源程序都是放在一个扩展名为.C的文件中,这对一个较简单的程序是合适的,但对于大型项目就不合适了,其一,大项目往往由多人合作完成,大家都来操作同一个文件极易出错;其二,大文件的编译、调试都极为复杂;其三,如果两个程序中都要用到同一个自定义的函数,此函数须从一文件移动到另一文件中,这种移动容易出错。为了解决这一矛盾,一个大的程序往往被分成几个部分,存放在不同的DOS文件各。各个部分可以分开编辑、编译,
[单片机]
瑞芯微AI、工控等全平台产品线亮相2018德国嵌入式
集微网消息,2月27日至3月1日,国际嵌入式应用展览会 (2018 embedded world Exhibition&Conference) 在德国纽伦堡举办,是全球最具影响力的展览会之一,也是全球规模最大的嵌入式系统展。 
 此次展会,Rockchip展示了超全平台应用,包括嵌入式AI、工控、智能音频、智能视觉及其他开发平台。 嵌入式AI平台 Firefly-RK3399开发板。采用了六核64位“服务器级”处理器Rockchip RK3399,拥有2GB/4GB DDR3和16G/32GB eMMC, 并新增DP 1.2、PCIe 2.1 M.2、Type-C、USB3.0 HOST等高性能数据传输和显示接口。Fi
[手机便携]
基于模型的设计简化嵌入式电机控制系统开发
本文描述了围绕基于ARM的嵌入式电机控制处理器构建的基于模型设计(MBD)平台的详细情况。 随后,本文提供最初部署的基本永磁同步电机(PMSM)控制算法示例,并介绍了方便的功能扩展,以包含自动化系统的多轴位置控制。 长期以来,系统和电路建模一直是电机控制系统设计的重要方面。 采用MBD方法后,电气、机械和系统级模型用于在构建和测试物理硬件前评估设计概念。 MathWorks最新的仿真工具可以对完整的嵌入式控制系统进行建模,包括电气电路和机械系统领域。 同时,嵌入式编码工具从控制系统模型生成C语言代码,将控制算法部署在嵌入式控制平台上。 这些工具实现了基于模型的设计过程,人们可以在最终硬件测试前先在仿真平台上进行设计并完全测试。 成
[单片机]
基于模型的设计简化<font color='red'>嵌入式</font>电机控制系统开发
单片机外中断汇编语言和C语言程序
以下两个程序效果相同,一个使用汇编语言,一个使用C语言,从仿真效果看,c语言程序运行比较流畅。 两个外中断跑马灯汇编语言程序 ORG 0000H LJMP MAIN ORG 0003H LJMP WZD0 ORG 0013H LJMP WZD1 ORG 0040H WZD0: MOV DPTR,#0220H MOV R3,#42D CB0: CLR A MOVC A,@A+DPTR MOV P1,A INC DPTR LCALL DELAY2 DJNZ R3
[单片机]
单片机外中断汇编语言和<font color='red'>C语言</font>程序
单片机C语言程序设计:单只数码管循环显示 0~9
/* 名称:单只数码管循环显示 0~9 说明:主程序中的循环语句反复将 0~9 的段码送至 P0 口,使数字 0~9 循环显示 */ #include reg51.h #include intrins.h #define uchar unsigned char #define uint unsigned int uchar code DSY_CODE ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //延时 void DelayMS(uint x) { uchar t; while(x--) for(t=0;t 120;t++); }
[单片机]
单片机<font color='red'>C语言</font>程序设计:单只数码管循环显示 0~9
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved