我正在寻找通用编程语言
到目前为止,下面是我的清单,我错过了什么?
自制的Forth运行时确实可以在很少的内存中实现。我知道有人在20世纪70年代在Cosmac上创造了一个。核心运行时只有30个字节。
还有JavaScript,通过Espruino。
这是专门为微控制器而构建的,并且有各种不同芯片(主要是STM32)的版本,可以将整个系统安装到8kB RAM中。
您是否考虑过使用/bin/sh
提供的busybox?或者他们推荐的smaller scripting languages?
Prolog - http://www.gprolog.org/
根据谷歌搜索“prolog small”,可以通过避免链接内置谓词来使可执行文件的大小变得非常小。
我建议使用python。但现在唯一的问题是内存开销对吗?所以我对以后可能会遇到这个问题的人有很好的建议。
首先,写一个bf解释器(或者从某个地方获取源代码)。口译员会非常小。另外,bf是图灵完整语言。现在你需要在python中编写代码,然后使用bfpy(https://github.com/felko/bfpy/blob/master/README.md)将其转换为bf。我给你的开销最小的解决方案,我很确定bf解释器很容易保持在10KB的ram使用率。
在问题或答案的列表中,没有一种语言能够满足超级简单编译和集成到现有微控制器项目的要求(披露:我实际上没有尝试过每一条建议)。
我找到了tinyscript这是一个单独的.c
+ .h
文件,与我项目中的其余源文件一起编译,只需要提供一个void outchar(int c)
,如果你不需要脚本输出,它可以是空的。
对我而言,执行速度远不如构建和集成的简易性以及与C的互操作那么重要,因为我的用例主要是按顺序调用某些C函数。
我一直在使用BlackFin上我以前的工作busybox。
我们为它编译了perl + php,在更改了s / fork / vfork / g之后它工作得很好......或多或少。没有MMU不是一个好主意。内存碎片很容易杀死服务器。我所做的只是:
for i in `seq 1 100`; do wget http://black-fin-ip/test.php; done
当我走向老板并告诉他服务器将在生产中死亡时,它就死了:)
我听说CHIP-8,XPL0,PicoC和Objective Caml已被移植到图形计算器中。维基百科“Lego Mindstorms”文章列出了一系列据称在Lego RCX或Lego NXT平台上运行的编程语言。他们中的任何一个符合您的“实时编码”标准吗?
您可能想要查看Forth wiki上的其他微控制器Forths。它列出了Atmel AVR至少4个Forth:amforth(你已经提到过),PFAVR,avrforth和ByteForth。 (链接到那些解释器,以及这个StackOverflow问题,包含在“Embedded Systems”wikibook中)。
我会推荐LUA(或eLUA http://www.eluaproject.net/)。我曾经将LUA“移植”到Cortex-M3上。从我的头顶开始,它的闪存大小为60~100KB,运行时需要大约20KB的RAM。我确实剥离了最基本的东西,但根据你的应用,这可能就足够了。仍然有优化的空间,特别是关于RAM要求,但我怀疑你可以在8KB中运行它。
一些AVR解释器/ VM:
Wren符合您的标准 - 默认情况下,它配置为仅使用4k的RAM。 AFAIK它没有看到任何实际用途,因为我写的那个人决定他毕竟不需要完全在目标系统上运行的解释器。
ML和Forth最明显地影响了语言。
你考虑过port in C的Tiny Basic吗?或者,也许从Z-80将UCSD Pascal p-machine改写为你的架构?
但是,严肃地说,JavaScript会成为一种优秀的嵌入式脚本语言,但我不知道VM + GC的最低内存要求是什么,也不清楚删除操作系统依赖项的难度。我曾经和NJS玩过一段时间,这可能符合你的需求。这个有趣的是编译器是用JavaScript编写的(自托管)。
你可以看看AVR非常强大的AvrCo Multitasking Pascal。你可以在http://www.e-lab.de试试。 MEGA8 / 88版本是免费的。有大量的JTAG调试器驱动程序和模拟器,以及所有标准设备(LCDCHAR,LCDGRAPH,7SEG,14SEG,LEDDOT,KEYBOARD,RC5,SERVO,STEPPER ......)的实时或模拟可视化效果。
你错过了EmbedVM,主页here,svn repo here。请记得在首页查看[1,2]视频;)
从主页:
EmbedVM是一个用于微控制器的小型可嵌入虚拟机,具有类似C语言的前端。它已经过GCC和AVR微控制器的测试。但由于虚拟机非常简单,因此将其移植到其他架构应该很容易。
VM模拟一个16位CPU,可以访问高达64kB的内存。它只能在16位值和16位和8位值的数组上运行。不支持复杂的数据结构(结构,对象等)。一个函数最多可以有32个局部变量和32个参数。
除了VM的内存外,一个小结构保存了VM状态和EmbedVM功能在堆栈上需要的合理内存量,VM没有额外的内存要求。特别是VM不依赖于任何动态内存管理。
EmbedVM针对大小和简单性而非执行速度进行了优化。 VM本身在AVR微控制器上占用大约3kB的程序存储器。在运行速度为16MHz的AVR ATmega168上,VM可以每毫秒执行大约75个VM指令。
VM完成的所有内存访问都是使用用户回调函数进行的。因此,可以在外部存储器设备,闪存等上具有部分或全部VM存储器,或者具有到VM的“存储器映射”硬件功能。
编译器是一个UNIX / Linux命令行工具,它读入* .evm文件并以各种格式生成字节码(二进制文件,英特尔十六进制,C数组初始化器和特殊的调试输出格式)。它还生成一个符号文件,可用于从主机应用程序访问VM内存中的数据。
C语言看起来像这样:http://svn.clifford.at/embedvm/trunk/examples/numberquizz/vmcode.evm
我建议使用MY-BASIC,运行至少8 KB RAM,并且易于移植。