嵌入式编程的替代语言

时间:2010-06-15 16:38:41

标签: embedded microcontroller

我正在寻找替代编程语言(从汇编,C,C ++和基础)到嵌入式(微控制器)编程。

例如,可以用C#或Java编程微控制器吗?也许Ruby或Python?

如果可能,请发布使用的开发工具和硬件。

18 个答案:

答案 0 :(得分:9)

还有Lua。请参阅eLua

答案 1 :(得分:8)

FORTH长期以来在嵌入式系统中很受欢迎。我没有具体的经验,但它非常巧妙地设计,即使在困难的微控制器上,使用线程代码解释方法,在很小的空间内提供了很多功能。对于相当于翻译的人来说甚至相当快。很容易获得FORTH的开发环境,并且很容易将其移植到新系统中。

人们喜欢或讨厌它,因为它坚持你用反向抛光表示法编写代码(基本上它是一堆堆有预定义操作符的堆栈机器)。

此SO主题似乎相关:https://stackoverflow.com/questions/122292/forth-love-if-honk-then

答案 2 :(得分:6)

FORTH在小型机器上有优点,但有一点学习曲线。

FORTH有许多方面,其中任何一个或全部都可以用于嵌入式开发。

与FORTH斗争的部分原因是处理存在的二分法。

对于一个人来说,你们Z-80 FigForth线程解释器的小型原始FORTH在开发人员为他们提供的环境方面非常低级。它们肯定比汇编更高,但可以说(在某些情况下)比C。

例如,开箱即用,FORTH(这些小的,很多人用小CPU考虑的旧版本)不允许你分配动态内存,或做(简单)指针算法。它甚至没有“结构”作为语言概念。你基本上可以通过常量来玩偏移量。最初,你甚至不能做递归。可以说,它最大的限制是它没有真正的数据类型。它根本没有输入,所有数字都可能是也可能不是指向内存的指针,可能是也可能不是数据或字符或其他什么。

当然,与此同时,您可以使用汇编程序和编辑器等在RAM的8K范围内获得完整的系统。

所以,就这样,它是,是的,比汇编更高级别,但低于C。

但是(这是一个很大的但是......)

虽然它可能会从较低级别开始,但作为程序员,您可以将其提升到您满意的任何抽象级别 - 您可以将它放在您想要的范围内。

你想要结构吗?你想从一个堆到malloc?你想要一个对象系统?这些都可以在建筑基础上使用。

您希望在语言级别为您的基于ISAM的小型记录系统提供一流的支持吗?容易。

考虑Common Lisp。它最强大的两个功能是宏和Reader,它们让您有机会将任意文本转换为随后编译的代码。

FORTH具有相同的能力,只是它走得更远。在较旧的FORTH中,您甚至可以访问编译器本身,而不仅仅是编译器的输入。线程解释器非常简单,易于修改。您可以对内存映像进行“原始”访问,您可以随心所欲地执行任何操作 - 所有这些都来自FORTH系统本身。

这就是FORTH可以轻松地“自我移植”到其他架构,如何优化特定的数据结构。许多旧的FORTH都是Threaded Interpreters,但他们没有理由这样做。如果您愿意,可以将FORTH编译为纯机器代码(即根本不需要解释器)。

当然,在现代“微型”控制器上,您可能只需将整个开发环境移植到设备上即可。永远不要再将图像复制到电线上(直到你当然备份它为止)。

当然,所有这些都需要工作。也许是太多的工作,这取决于设计师/编码员的决定。它是一个原始的工具包,可用于制作非常强大的东西。

答案 3 :(得分:5)

我在较小的机器上使用自定义pcode解释器来节省代码空间。

大多数嵌入式系统都有一些可能性能很高的部分,而且很多东西很少运行或性能无关紧要。

我已经实现了许多应用程序,其中硬核快速的东西是用汇编语言编写的(因为这是我作为开发工具所能得到的),然后为我自己的私有指令集编写了一个pcode解释器机器方向。

您开始使用的几乎所有操作都是PUSH / POP操作数(8或16字节),ADD / SUB / MUL / DIV,CMP,IF / GOTO和调用的操作码,即使在丑陋的指令集。之后,您尝试使用CALL编写子例程,并且只添加操作码来执行pcode无法执行的操作(设备I / O),或者需要更快的编译。

即使使用汇编程序,在这样的pcode解释器中进行编码也非常简单;你只需编写“BYTE”汇编程序指令,其中散布着“WORD”指令,具体取决于操作码的内容。

这个答案基本上就是穷人对我之前给出的FORTH答案的变化。

答案 4 :(得分:4)

您可以尝试在mbed或STM32平台上支持的python-on-a-chip,也可以移植到其他平台。

与嵌入式世界中的大多数内容一样,您的选择取决于您的约束。你有没有致力于一个平台?你有多少代码空间/ RAM?你的芯片可以支持操作系统吗?

答案 5 :(得分:3)

如果您正在编程微控制器,您几乎总是需要C或嵌入式C ++,其他任何东西在芯片闪存上都会占用太多宝贵的东西。这些是我推荐的两种语言,如果你不是手工组装的东西(真的,这些天是谁做的?)

我像其他人一样使用嵌入式C ++,例如在Arduino上,我也在我使用的ARM板上使用C语言。

答案 6 :(得分:1)

您可以在C#下的.NET下编写代码。您必须使用.NET Micro Framework。 但我喜欢C这种东西的语言。我在C处理器ARM7Cortex-M3上用Keil Framework写了这个工作,这个框架支持许多编程接口和处理器。

注意:Micro Framework不是实时操作系统(来自评论的Matthew Whited)

答案 7 :(得分:1)

我曾经在FORTH中对Zilog Z180进行编程。我不想再这样做了!

可以在.NET Micro上使用C#,但是你需要一个至少具有256Kb RAM的32位处理器,这对于实时应用程序来说并不好。然而,对于正确的应用程序而言,生产率很高,并且如果供应短缺而C#专业知识不足,则可以使用没有广泛嵌入式专业知识的编码人员。

Java是可行的,特别是在硬件字节码执行的部分,例如某些ARM9和更高端ARM设备上的Jazelle单元。但是它仍然需要一个JVM端口,这可能很昂贵。它通常用作嵌入式Linux端口的一部分,因此您也有所有这些开销,因此可能比.NET Micro更耗资源。

英特尔过去常常为4004到803286的各种英特尔处理器生成一种名为PL/M(微型计算机编程语言)的非常简单的语言,但它不再可用或不受支持,并且没有超过C的优势。 / p>

Ada被广泛使用,特别是在军事,航空和安全关键应用中。

某些目标可以使用

Embedded Pascal

您可以使用NI LabView作为嵌入式系统的代码生成器。事实上,这就是Lego Mindstorms所依据的。工业版比玩具版更精致,功能更齐全!同样,您可以使用MATLAB和SimuLink生成嵌入式代码。这些不一定是效率最高的,但更多人认为精密电机控制信号处理,SimuLink可以高效生产。

答案 8 :(得分:1)

首先,asm和C是主要的选择,并且有充分的理由。从那里开始,建立一个可以依靠的基础。

我们注意到wikireader是第四个被驱动的或者至少有一些第四个组件。我从未学过的语言,但可能有一天。

达拉斯半导体TINI板(dallas semi已经被格言同化)是专门用于嵌入式JAVA板的。因此,相对于普通的微控制器/电路板,它们必须放置大量的柱塞和闪光灯。我认为那些董事会仍在那里。

在TINI出来的时候,争论就是java可以嵌入。也许它可以。我的理解是Python在某种意义上类似于java,它被解释或编译成公共字节代码或机器代码。在JAVA的情况下,jvm是针对特定目标的通用机器语言的模拟器。如果是python的情况那么理论上python可以像java一样嵌入。我被告知第四个是基于堆栈或堆栈就像java一样,所以这也意味着第四个可以嵌入,java也可以。只要你有足够的ram用于堆栈,并为vm / emulator提供足够的程序空间和带宽。这就是问题所在。这就是问题所在。 ram和rom价格昂贵,是该部件的主导价格和电力消费者。谁想要支付10美元的东西,以便它可以使用java,当他们可以使用C / asm获得更多的$ 1部分?至少这是市场会告诉你的。

另一方面,有一种观点认为linux可以嵌入,而人们正在以这种方式使用它。这意味着兆字节或千兆字节,千字节可以更快,更好,更可靠地完成工作(尽管可以说具有更高的前期开发成本)。因此,一些较新的嵌入式ARM和mips将拥有您正在寻找的资源。

我的理解是gcc,也许最终如果还没有llvm可能有java和其他前端(例如ada,也许是pascal)。这意味着你可以用java编写,例如将它编译成目标处理器的机器代码,而不是通用的java字节代码或者它所调用的任何代码。这将是您从脚本语言到真实机器指令的理想情况(假设您继续追求C / asm之外的其他内容)。

简短回答:可能吗?是的,可能。 Dallas TINI是使用java的一个特定示例。使用看似正在发生的事情来看看wikireader。

答案 9 :(得分:1)

Here是可以与8位AVR微控制器一起使用的语言列表。它包括Basic,Java,Pascal,Python和Scheme。特别是,PyMite实现了Python解释器的一个子集。

答案 10 :(得分:1)

从kickstarter开始,Micro Python现已推出,专为嵌入式设备而设计 http://micropython.org/ https://mail.python.org/pipermail/python-list/2014-June/672994.html

"支持几乎完整的Python 3语法,包括yield(编译 99.99%的Python 3标准库。"

答案 11 :(得分:0)

如果将JavaCard计为微控制器,则可以用Java编程。

答案 12 :(得分:0)

对于PIC的JAL,它附带了一些不错的库。

答案 13 :(得分:0)

你可以看看AVR非常强大的AvrCo Multitasking Pascal。您可以在http://www.e-lab.de处尝试。 MEGA8 / 88版本是免费的。有大量的JTAG调试器驱动程序和模拟器,以及所有标准设备(LCD,7SEG,14SEG,LEDDOT,KEYBOARD,RC5,SERVO,STEPPER ......)的实时或模拟可视化。

答案 14 :(得分:0)

对于Python来说,曾经有一个有趣的项目:Deeply Embedded Python,但我认为它已经有一段时间了。

答案 15 :(得分:0)

我认为这个问题至少有两个答案。首先,我想强调的是,如果您接近硬件编程并且资源有限,您会发现C或C ++是最适合您的工具。高级语言不容易进行位级操作等,但这些都可以在C中轻松完成。解决方案的一部分是找出最适合工作的工具,以及用于低级别的东西Python或Ruby不是你想要的。

另一方面,如果您想要做的只是编写一个在微控制器上运行的应用程序,那么根据您正在处理的目标,您可能有多个选项。许多所谓的嵌入式平台比仅仅几年的工作站功能强大得多,因此运行Linux可以为您提供大量的语言选择。

答案 16 :(得分:0)

有几个物理上很小的设备运行或多或少的完整版Linux。 您可以使用在Linux上运行的几乎任何编程语言对它们进行编程,例如几乎任何人类已知的编程语言。

对于具有少量RAM的微控制器,太小而无法运行Linux,请参阅 StackOverflow: "What are the available interactive languages that run in tiny memory?"

答案 17 :(得分:-1)

几个月前启动了项目RubimC - 用于内存较小的微控制器的Ruby编译器和framefork。当前版本正在运行,但并未实现Ruby的所有功能。