现在几乎每个人都会说祝福:
性能!
好的,C确实可以编写运动代码。但是毕竟还有其他语言可以做到!而且现代编译器的优化功能非常强大。C是否具有其他语言没有的某些优势?还是在该领域根本不需要更灵活的工具?
现在几乎每个人都会说祝福:
性能!
好的,C确实可以编写运动代码。但是毕竟还有其他语言可以做到!而且现代编译器的优化功能非常强大。C是否具有其他语言没有的某些优势?还是在该领域根本不需要更灵活的工具?
Answers:
现在几乎每个人都会说祝福:
性能!
这就是其中的一部分;确定性资源的使用在资源有限的设备上很重要,但是还有其他原因。
C被设计为对CPU建模,因为C被创建为使Unix跨平台可移植,而不仅仅是编写汇编语言。
这意味着对于需要具有非常接近实际CPU的抽象级别的程序的C语言,C程序可以很好地工作,嵌入式硬件就是这种情况。
注意:C是在1970年左右设计的,当时的CPU比较简单。
统治的一个原因是它拥有完成任务所需的正确工具。在Java和C / C ++的嵌入式平台中进行开发之后,我可以告诉您C ++的基本方法更为自然。使开发人员避免因为语言水平太高而感到自己跳得太快,这很烦人。一个很好的例子是Java中没有无符号变量。
而且,VM /解释语言的便捷功能通常是不可行的,因此无法实现,例如垃圾回收。
C本身仅需要很少的运行时支持,因此开销要低得多。您不必在运行时支持上花费内存或存储,也不需要花费时间/精力来最小化该支持,也不必在项目设计中考虑到这一点。
switch
es 构建的大型状态机是可怕的,而使用类层次结构构建的相同状态机则很好并且易于维护。
switch
,在许多嵌入式应用程序中仍会使用梯形图逻辑(您可以说是甚至更原始的版本)。易于调试,易于验证。
正如在其他答案中提到的那样,C是在1970年代初开发的,以取代小型计算机体系结构上的汇编语言。那时,这些计算机的成本通常为数万美元,其中包括内存和外围设备。
如今,您可以使用单价为4美元或更少的16位嵌入式微控制器,获得相同或更高的计算机功能-包括内置RAM和I / O控制器。32位微控制器的成本可能要高一到两美元。
当我为这些小家伙编程时,这是我90%的时间在不设计他们坐在的板上时所做的事情,我想形象地看到处理器将要做什么。如果我可以在汇编器中编程得足够快,那么我会这样做。
我不需要各种各样的抽象层。我经常通过逐步浏览屏幕上的反汇编程序进行调试。开始使用C编写程序时,这样做要容易得多。
随着编译器的改进和硬件性能的提高,C ++越来越多地被使用,它并不完全占主导地位。但是,由于某些原因,C仍然很受欢迎。
广泛的支持。几乎每个芯片供应商都提供ac编译器,任何示例代码和驱动程序都可能用c编写。C ++编译器变得越来越普遍,但对于给定的芯片而言却不是合格的证明,并且它们通常是错误的。您还知道任何嵌入式工程师都可以在c中工作。这是该行业的通用语言。
性能。是的,你说了。在核心例程仍经常用汇编器编写,或至少参考汇编输出用c优化的环境中,性能仍然是最重要的,永远不要低估它的重要性。通常,嵌入式目标的成本非常低,并且具有很小的内存和很少的干扰。
尺寸。C ++倾向于更大。当然,使用STL的任何东西都会更大。通常,就程序大小和内存占用而言。
保守主义。这是一个非常保守的行业。部分原因是失败的成本通常较高,调试通常较难访问,部分原因是无需进行更改。对于小型嵌入式项目,c做得很好。
对于嵌入式系统,重要的是性能。但是,就像您说的那样,为什么使用C而不使用其他性能语言?
到目前为止,很多人都提到了编译器的可用性,但是没有人提到开发人员的可用性。比起OCaml,已经有更多的开发人员知道C。
那是三个大家伙。
嵌入式软件有很大的不同。
在桌面应用程序上,抽象和库可为您节省大量开发时间。您可以奢侈地抛出另一个兆字节或千兆字节的RAM或某些2 + GHz 64位CPU内核,而其他人(用户)则为此硬件付费。您可能不知道应用程序将在什么系统上运行。
在嵌入式项目中,资源通常非常有限。在我研究的一个项目(PIC 17X系列处理器)中,硬件具有2Kword的程序存储器,8级(硬件内)堆栈和192字节(<0.2kB)RAM。不同的I / O引脚具有不同的功能,您可以根据需要通过写入硬件寄存器来配置硬件。调试涉及示波器和逻辑分析仪。
在嵌入式中,抽象通常会妨碍您的工作,并且会管理(和花费)您没有的资源。例如,大多数嵌入式系统都没有文件系统。微波炉是嵌入式系统。汽车发动机控制器。一些电动牙刷。一些降噪耳机。
对我而言,开发嵌入式系统的一个非常重要的因素是根据指令,资源,内存和执行时间来了解和控制代码所转换的内容。指令的确切顺序通常控制例如硬件接口波形的时序。
抽象和幕后的“魔术”(例如垃圾收集器)非常适合桌面应用程序。当可以动态分配内存时,垃圾收集器可以节省大量时间来减少内存泄漏。
但是,在实时嵌入式世界中,我们需要知道并控制所需的时间,有时甚至要低至十亿分之一秒,并且不能在出现问题时抛出另外几兆的RAM或更快的CPU。一个简单的例子:通过控制占空比对LED进行软件调光时(CPU仅对LED进行开/关控制),处理器不能关闭并进行100ms的垃圾收集,因为这将明显地显示出来闪烁明亮或熄灭。
一个更假设的示例是直接触发火花塞的发动机控制器。如果该CPU关闭并且进行垃圾收集50ms,则发动机将停顿片刻或在错误的曲轴位置处着火,可能会使发动机失速(通过时)或对其造成机械损坏。您可能会杀死某人。