在上一篇文章中 ,我谈到了IoT(物联网)以及将物理对象(“物”)连接到Internet。 我已经讨论了Mongoose OS (一种用于IoT的开源操作系统)如何使新手和专业开发人员都能轻松地使用JavaScript编程微控制器。
您可能想知道为什么使用JavaScript,以及JavaScript引擎如何装入微控制器的有限内存中。 有许多旨在将脚本编写在微控制器上的项目,其中包括其他JavaScript项目,包括Duktape , Espruino , Jerryscript , MuJS和V7 。 还有其他脚本语言,例如MicroPython和Lua 。
这些项目共享的一件事是尝试将整个语言规范与完整的标准库一起实现。 有优点也有缺点。 优点很明显,但是缺点是什么?
首先,没有一种流行的脚本语言最初是针对嵌入式环境设计的。 它们沿一些晦涩的构造拖延,这些构造占用宝贵的空间,但在嵌入式上下文中几乎没有实际用途。
其次,要将特定于硬件的功能导出到脚本环境(例如某个传感器API或某个LCD显示API)中,您需要编写粘合代码。 而且,您需要维护该粘合代码,这会占用宝贵的空间并增加整体复杂性。
为了解决这些问题,引入了新JavaScript引擎。
mJS是Mongoose OS的一部分,采用了截然不同的方法:
这些功能使mJS可以容纳约25K的闪存空间,并且不到1K的RAM。 很难被击败。 但是,如果没有标准库又没有任何胶合代码,如何进行开发? mJS的答案是可以直接调用C SDK(软件开发工具包)功能。
外部功能接口(FFI)可以直接加载和调用C函数。 要执行这些步骤,mJS必须知道两件事:C函数的地址和C函数的签名。 然后将JavaScript参数编组为C值,并将它们放到ABI(应用程序二进制接口)的位置 要求(例如,在CPU堆栈上),然后跳转到函数的地址。 实际上,它看起来像这样:
let f = ffi ( 'int gpio_write(int, int)' ) ; f ( 2 , 1 ) ;
此代码段加载C SDK函数gpio_write(int引脚,int值)并调用它,将GPIO引脚2设置为高电压电平。 就这样。 是否需要SDK或第三方库的其他功能? 只需按需加载即可。 您甚至可以执行以下操作:
let malloc = ffi ( 'void *malloc(int)' ) ; let mem = malloc ( 10 ) ;
不是说您应该 ,但是可以 。 同样,您可以封送C回调:
let Timer = { set : ffi ( 'void timer(int, void (*)(int, userdata), userdata)' ) } ; Timer. set ( 100 , function ( time ) { print ( 'Time now: ' , time ) ; } , true ) ;
您需要嵌入API吗? 不,你没有。 您也不需要任何粘合代码。 而且您也不需要标准库。
查看如何在我们的Mongoose OS示例固件中使用mJS。 而且,您可以将其与任何C / C ++软件一起使用,例如特定的固件。 有关更深入的介绍, 请参见mJS GitHub存储库以获取嵌入示例。
翻译自: https://opensource.com/article/17/4/mjs-JavaScript-engine