为什么严格嵌入C / C ++


15

我不喜欢这个问题,因为这个问题很难回答,但也许我可以改写:“是什么使嵌入式语言无法更改语言?”

例如,我们几乎看到了用于嵌入式的C / C ++(我想我也听说过ADA?如果我错了,请纠正我)

但是究竟是什么使嵌入式世界避免语言的变化呢?仅仅是C太容易使用还是因为C一切都很好,所以真的没有改变的“需求”吗?

这总是让我感到困惑,而不是我在抱怨。由于将其保留为几种语言,因此可以使事情标准化。但是问题仍然存在。

我意识到这是一个主观问题,但是我的主要问题是“为什么”而不是“ IF / WHEN”


2
您是否希望在嵌入式系统上看到特定的高级语言?编辑:或更确切地说,您对C不提供的语言功能感兴趣?
乔恩L

1
@JonL-我希望C有很多低级功能。EG在大整数内部更好地进行位/半字节/字节/字操作。更好的安全支持,例如Ada具有的功能类型。
Rocketmagnet

3
嵌入式不严格C.下面是嵌入式系统一堆高级语言:electronics.stackexchange.com/questions/3423/...
Kellenjb

1
“嵌入式”具有不同的含义。运行烤面包机的4位微控制器不同于ECU或机顶盒。这种频谱使您的问题难以回答。
Toby Jaffey

1
而且,正如预期的那样,此操作已关闭。我曾希望这个问题能得到高质量的答案,并且人们会努力将其保留为一个好问题,但事实并非如此。取而代之的是,我们得到的答案很多,一个句子得到多个投票,一个散文的答案带有夸张的旗帜,另外一个答案在一天之内就产生了更多的旗帜,而其余站点合在一起。问题在于,对于许多人来说,为什么他们没有改变,有许多不同的正确答案。
Kortuk

Answers:


18

首先:忘记“嵌入式”,因为这不是有用的区别。最重要的属性是“资源受限的”。最重要的资源通常是时间,在这种情况下,我们谈论的是实时系统,但也可以是内存或电源。

  • 采用新语言很难而且很少。它需要重新培训,新工具,并找到一种使用新语言的好方法。这是昂贵的,特别是对于早期采用者。这也是一个鸡与蛋的问题:没有庞大的用户群,就不会有高质量的工具和库,但是没有那些,就不会有庞大的用户群。因此,一种新的语言必须比现有的语言具有更大的优势,否则它将没有机会。

  • 语言的大多数“最新”新发展都在填补可用的CPU能力和用户需求之间的空白。换句话说:它们的速度效率低下,但是可以通过简化程序员来弥补。考虑一下诸如Java,Python,Perl,Tcl之类的语言的兴起,这些语言实际上是由解释器运行的(也许经过一些编译),并且大量使用了动态内存管理。但这与资源受限的世界并不十分匹配,在这个世界中,我们希望最大程度地利用a)可用资源,即使以更多的编程工作为代价,以及b)可预测的资源使用。

  • C和C ++(或合适的子集)仍然是可以满足可预测的时间和空间要求的通用语言(足够好的工具,训练有素的程序员和丰富的库都可用)。从当前硬件可能的情况来看。我认为唯一的竞争者是Ada,但它的起点很差:第一个实现(被认为是?)太慢且效率低下,而现在(即使有很好的实现可用),该语言也落后了一段时间。功能(与C ++相比)。我个人认为这很可惜,在其他条件相同的情况下,我宁愿乘坐Ada编程的飞机,也不愿使用C或C ++编写的飞机。


+1-好答案。Ada似乎是一种有趣的语言,周围是否有适用于小型微型计算机的Ada编译器?
奥利·格拉泽

有GNAT,即GCC Ada编译器。但是AFAIK在微尺上的使用并不多,因此您将很难找到可以读取的东西。
Wouter van Ooijen 2012年

是的,我在Wiki页面上看到了GNAT。您是对的,对于小型微型计算机来说并没有太多支持,但是对于68k,x86,MIPS等(例如DDCI)上的关键任务产品似乎有相当多的支持(如您期望的那样)
Oli Glaser

我看到也有SPARK Ada,如下面的Deek所述。当我有一些他们所说的难以捉摸的东西时,我将不得不检查一下……
Oli Glaser 2012年

2
如Arduino所示,以Gnat形式存在的Ada在AVR微处理器上可以正常工作。我构建的最小的Gnat可执行文件是65个字节。诚然,尽管等效的Arduino草图超过1K,但它所做的只是使LED闪烁。到我的可执行文件达到600字节时,它可以独立驱动2台步进电机...您不需要SPARK-除非您想证明您的LED闪烁灯在形式上是正确的!
Brian Drummond

9

使用基于8位和16位微控制器的嵌入式系统,可以更轻松地开发出适合这些非常有限的存储限制的有限资源的软件(对于低端8位微控制器而言可能只有几百个字节的RAM) ,带有2-8 KiB的ROM或EPROM / Flash用于代码存储)。

在这些情况下,像C或汇编语言这样的小语言往往是最常用的开发语言。作为一个非常粗略的相对比较,一个完整的汇编器和C99编译器可以放在单个软盘上,而现代C ++开发系统(带有STL等)则需要多个MiB

当您在嵌入式环境中查看高端微处理器(高端16位,大多数为32位,很少使用64位)和DSP时,限制会减弱,软件开发可能会占据开发的大部分因此,使用最高效的开发工具是有意义的,其中包括功能更高级的语言,例如具有面向对象的编程(OOP)语言(如C ++)和较新的语言(Java,Perl,Ruby,Python)。

在汇编语言和C语言中,可以预测正在使用多少内存,以便进行空间受限的设计是可行的,但是诸如模板,异常处理和运行时绑定之类的高级功能使无法准确知道所需的内存占用量预先获取标准的C ++程序。我对MISRA C ++(它是C ++的一个子集)了解得不够多,无法对此发表评论。

在嵌入式开发人员的经验中,基于运行字节码的虚拟机的语言(Java,Perl,Python)较不成熟,并且由于这些语言旨在使程序员与特定的硬件隔离,因此也变得更加难以良知。此类嵌入式硬件系统的局限性和局限性。如果不是RAM的GiB,那么对于带有MiB的快速32位处理器(例如ARMv7)来说,这些问题就更少了。

我知道的所有BASIC实现在语言功能上都非常简单,在很大程度上保留了1960年代Dartmouth BASIC的传统。这意味着该语言没有任何复杂的运行时库或异常处理,并且解释器或编译器的编写非常简单,并且文件大小也很小。大多数微控制器至少具有一个可用的BASIC编译器。

我希望能大致概述一下您会发现C和汇编语言主要用于较小或较旧的嵌入式系统的原因,以及较新的中高端嵌入式系统的局限性与传统台式个人计算机之间的微小差异。


5

大多数答案已经说明了历史原因(众所周知,每个人都在使用它,改变习惯并不容易,等等)。在我同意他们的同时,我们应该记住,还有另一个重要原因。

它的 不是说“C是一个坏或过时的选择,但我们仍然使用它的习惯”(如QWERTY键盘)。

C本身对于嵌入式开发是一个非常好的选择,特别是在时间紧迫的应用程序中。为什么?

  • 它的级别足够低,可以轻松地用于实施实时程序。如果您需要以纳秒为单位测量时间,必须每5微秒捕获一次中断,或者必须使用完全 64字节的总RAM,那么使用非常高级的语言,通常将是不可能或很难解决它。C使您可以更好地控制硬件与高级语言相比,,这是嵌入式开发与PC开发之间最重要的区别之一。

  • 与Assembly相比,它足够高,可以快速且易于编写代码。

因此,C是汇编语言的速度和直接硬件访问以及易于阅读和理解高级语言之间最好的(或最好的之一)。


1
我认为对C有利的一个主要方面是,它允许一个人为特定平台优化代码,同时允许此类代码在其他平台上运行(也许效率不高)。在诸如PIC之类的东西上,许多C指令将可预测地转换为机器指令。像这样的循环unsigned char i=63,j=128; do {something;} while(--j); while(--i);不如可读unsigned int i=16000; do {something;} while(--i);,但在PIC上它将运行得更快,效率更高。如果将代码移至ARM,则第二种方法会更有效,但第一种方法仍然有效。
2012年

4

这是为什么在(通常)编程中(最常用的)语言不(真的)改变的原因完全相同:

  1. 大量现有代码(库/现有实现)
  2. 可以使用这些语言(IDE,模拟器等)的大型工具集

4

在嵌入式世界中,提供软件更新可能会更加困难(或不可能),因此确保正确性就变得尤为关键。遗憾的是,C在这方面几乎没有提供帮助,并且允许程序员快速灵活地玩游戏。

我为嵌入式系统使用C感到很痛苦,希望我至少可以升级到C ++,以获得C以约束,常量,引用,字符串键入等约束形式提供的许多好处。

我猜答案只是因为我们在C语言上受困,因为更改在商业上不可行。每个人都知道C,它有很多编译器,有很多库和生成它的工具。使用新的语言,我们将从头开始。

我想这就是为什么人们仍然使用PHP的原因。

PHP double claw hammer.


如果您想讨论问题,请使用评论或meta,如果您想拍打背面的好问题,请对该用户进行投票或评论。
Kortuk

您可以始终使用Pascal-它似乎具有您正在寻求的附加限制:-)。或某种形式的超级皮棉。
罗素·麦克马洪

2
使用C的一个可能非常重要的原因是,与C ++编译器相比,编写基本C编译器要容易得多。在完成更重要的任务之前,我做了一段时间。好玩的东西!编写C ++编译器?啊。不过,我更喜欢C ++作为用户。
darron 2012年

1
@RussellMcMahon-我不能使用Pascal,因为我正在使用的MCU没有Pascal编译器。
Rocketmagnet

@darron-很好。但是,有很好的开源C ++编译器,例如gpp。他们只需要为此写一个后端即可。
Rocketmagnet

4

这里没有人听说过SPARK Ada吗?

这是Ada语言和相关开发工具的“小版本”,适用于嵌入式系统,例如航空电子设备和其他对安全至关重要的应用程序,例如医疗设备。

研究表明,与使用更可靠的SPARK编码的C / C ++相比,处理速度仅损失5-10%。

我认为C在嵌入式系统中的普及是由于经济原因:

  • 它已经存在并且通常可用于大多数应用程序-并且大多数应用程序在数量上都不重要,如果洗衣机超负荷,没人会死-那么为什么要更换?

  • SPARK工具集本身将是额外的支出,并且会培训员工使用它。

  • SPARK(或其他非C语言)给嵌入式控制器/管理系统带来的额外好处可能不足以证明在消费者眼中产品价格具有必要的溢价,尤其是当他们看到明显“好的”竞争对手品牌在销售时以较低的价格。

  • AdaCore公司小心谨慎,不要深入大众市场,因为这些应用将不可避免地需要大量增加技术支持人员来处理非核心问题。AdaCore是一家高水平的专业公司,因此而引以自豪,并向高科技公司推销其产品和服务。除非一种语言的主要利益相关者真的愿意,否则它要进入新市场是不寻常的。

因此,@ Wouter,您无需担心会因为缺少Ada嵌入式代码而死在空中!

它已经在飞机系统中使用了很多年。对于您的起搏器也是如此。

但是对于洗碗机,建筑服务控制系统,实验室炉控制器和其他不受严格监管的领域-在经济上值得加倍努力吗?


有趣,谢谢-我没有听说过SPARK,我们将检查一下。
奥利·格拉瑟

一些研究表明,相对于C中的现有应用程序,其速度有所提高-查看“ Ironsides” DNS服务器...
Brian Drummond 2012年

3

我猜想C受欢迎的主要原因是:首先是C流行起来,很多人都知道它;其次:Java,C#甚至C ++的许多方面都不适合嵌入式工作。基本上,我提到的其他3种语言在很大程度上依赖于动态内存,动态内存会带来不确定的程序执行,对象会带来动态内存,从而带来大量内存需求(因为OO最重要的方面之一是使用大量的类),及时编译的日益普及(许多嵌入式平台甚至根本无法编译自己的C代码)...

还有一个事实,就是Java或C#附带的许多库对于大量的嵌入式项目都是无用的。

另一方面,我们有较旧的语言,例如Pascal或Basic。从我的角度来看,它们并不那么受欢迎,因为C使其本身成为“行业标准”语言,并且当今有大量的程序员和工程师学习C。在某些学校,甚至没有学过Pascal或Basic。还有一个事实是,当今流行的许多语言都具有类似C的语法,而使用Pascal会使C程序员感到奇怪。

至于FORTRAN,我想它进入了一个小众领域,并且主要由在合适的生态系统中使用的工程师和科学家使用。我没有看到任何特殊原因(除了我在Pascal和Basic中提到的那些原因),没有在嵌入式系统上使用它。

请注意,在这个答案中,我主要关注较小的系统。也有许多嵌入式设备使用更复杂的操作系统,例如GNU / Linux或其他Unix派生产品,并且对其进行编程,或多或少可以使用任何popualr语言。


1
C之所以受欢迎是因为C受欢迎吗?:-)
stevenvh 2012年

2
@stevenvh是的,是的。这是一种积极的反馈回路。它越受欢迎,就越受欢迎。
AndrejaKo 2012年

3

C是一种非常简单的语言,在多种场合都被称为花哨的汇编语言。这几乎是您可以在汇编代码上方提供的最少抽象量,因为C构造相当直接地映射到机器级构造上。

由于这个原因和其他一些原因,在新芯片上实现C编译器非常容易。许多工作已经完成,复杂性或出错情况相对较少,并且低级控制使您可以轻松地处理硬件所具有的任何怪癖。

可以(实际上最初是)将C ++实现为C之上的源代码转换层,这意味着您可以使用C编译器免费获得C ++(或至少它的某些版本)。

使用C和C ++,您几乎可以引导新芯片所需的所有其他东西,这使它成为逻辑上的起点。


3

其他人未提及的一些原因:

  • 问题空间:C适用于小型和简单的系统。如果您所要做的只是对外部信号做出反应,并向周围推几个数字,那么C的效果就很好(没有复杂的数据结构,没有malloc,没有复杂的错误处理)。

  • 生产量:如果您有大量生产,那么从经济上讲,节省每个硬件单元并在程序员上花更多的钱是明智的,因为编程是一次性的成本。



1

实际上,对于小型嵌入式系统,C比C ++流行得多。其原因与不使用其他语言的原因相同。C ++需要运行时,除非您放弃了使其与C不同的大多数功能。

除了汇编之外,C是我所知道的唯一一种可编译为本机代码并且具有运行时可选的语言。因此,在受限的环境中(除非您使用汇编程序),它保证是最小的占用空间和最快的执行时间。

另一方面,在中型和大型嵌入式系统中(我的意思是更多的内存和时钟,更大的字长),我不会说C(或C ++)如此流行。我见过支持Python,Forth甚至Java的系统。

但是,显然,出于与我上面提到的相同的原因,您几乎总是可以选择使用C / C ++。有了选择,并成为一个已经对小型嵌入式C感到满意的人,为什么还要选择另一种语言?


4
C ++会产生大量开销,但是我用于MSP430的完全兼容的C ++编译器不需要运行时,C ++确实可以编译为本机代码。很抱歉,告诉其他人是有害的,我已经打败了你。您可以通过提供能使我确信我不正确的引用来删除下降表决(这很困难,我已经阅读了我项目的已编译C ++的程序集清单,以确保其有效编译的一部分),也可以删除答案以将其删除对您声誉的影响(尽管此时您获得了+8净收入)
Kortuk

3
我完全同意Kortuk。C ++的某些部分需要广泛的运行时支持,但不需要的部分仍然是更好的C(以及完整的OO)。某些编译器和链接器开关很容易强制执行对此子集的限制。在某些部分(例如,可怕的printf),C ++至少具有语言潜力,需要更少的运行时支持(如果仅在考虑到小型系统的情况下实现了std :: cout ...)
Wouter van Ooijen 2012年

1
@Kortuk,很抱歉在此不清楚,但是当我说“ C是唯一的语言...”并不意味着C ++没有这两种东西时,我的意思是C兼有两者的结合C ++就是其中之一。我的重点是运行时部分。我也不是说没有运行时就完全不可能使用C ++,但这很不寻常。我看不到如何在没有运行时的情况下拥有异常处理和RTTI之类的东西,这些都是非常重要的功能。但是我很抱歉如果我的表达方式导致了误解。
fceconel 2012年

@fceconel,我从未在运行时环境中使用过C ++,并且在这里讨论嵌入式系统,我从未在微控制器上使用过运行时。这个问题与您可能已经读过的有所不同,它是在问为什么C / C ++是唯一的普遍选择,而不是为什么C而不是C ++。我会承认,在我的微型电脑中永远不会使用像cout这样简单的东西,我有一些空闲的引脚,而不是屏幕。
2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.