
首先为ARM单片机添加脚本。这个项目在STM32F469I-DISCO电路板上运行V7 JavaScript VM,并向JS公开两个ARM mbed SDK调用。 ![]() 项目中使用的东西 硬件组件 意法半导体STM32F469I-DISCO ×1 任何由ARM mbed平台支撑的板都可以工作 软件应用程序和在线服务 ARM mbed在线编译器 Arm Mbed Mbed命令行接口 替代在线IDE Mongoose OS emmm~ 编写一个JavaScript小脚本,通过与几个ARM mbed C HAL函数交互,使STM32F板上的LED闪烁。 它应该在ARM mbed支持的其他目标上工作。 背景 有很多原因可以解释为什么您想要在嵌入式MCU中添加脚本功能。 这里的这个项目主要关注那些希望将JavaScript VM嵌入到现有的C固件e中的人。为了快速定制核心业务逻辑,而不需要对设备进行反流。 在这个项目中,我将选择V7,这是一个嵌入的JavaScript虚拟机,我和我的队友一起在Cesanta合作。 V7库作为两个文件分发:V7。c和v7.h。为了使用V7库,您需要做的就是在项目中导入这两个文件。 V7是用可移植的C语言编写的,因此很容易在c++中使用。V7是平台独立的;在这里,我们将展示如何将它嵌入ARM mbed项目中,并在STM32F4设备上构建它,但它也应该在其他目标上工作。 让我看看代码 下面是完整的源代码: #include "mbed.h" #include "v7.h" DigitalOut led_green(LED1); enum v7_err js_set_led(struct v7 *v7, v7_val_t *res) { led_green = !v7_get_bool(v7, v7_arg(v7, 0)); return V7_OK; } enum v7_err js_wait(struct v7 *v7, v7_val_t *res) { wait(v7_get_double(v7, v7_arg(v7, 0))); return V7_OK; } int main() { struct v7 *v7 = v7_create(); v7_set_method(v7, v7_get_global(v7), "setLed", &js_set_led); v7_set_method(v7, v7_get_global(v7), "wait", &js_wait); v7_exec(v7, "while(true) {" \ " setLed(false);" \ " wait(0.5); " \ " setLed(true);" \ " wait(0.5); " \ "}", NULL); } 您可以轻松地在ARM mbed在线编译器或命令行工具中克隆项目;打开:http://developer.mbed.org/teams/ ... javascript_blinker/ 我们将分解这个项目,并展示如何安装所需的依赖项。 在JavaScript 让我们先看看如果没有脚本部分,一个简单的blinker会是什么样子: #include "mbed.h" DigitalOut led_green(LED1); int main() { while(true) { led_green = false; wait(0.2); led_green = true; wait(0.8); } } 您现在可以在mbed在线编译器中编译此代码,或者也可以使用mbed-cli工具。 接下来,进入JavaScript 首先添加V7库。我把v7.c和v7.h文件打包在mbed代码库中,因此将它们添加到项目中并获得更新更容易。 ![]() 或者,如果您使用命令行工具: 现在,库将被构建到您的固件中。但为了使用它,你需要包括它的标题: #include "v7.h" 然后,在主函数中,必须创建虚拟机的实例: struct v7 *v7 = v7_create(); 这个v7变量保存了整个VM状态,需要在调用v7 API函数时传递。 那么,我们如何运行脚本呢? v7_exec(v7, "print('hello from javascript')", NULL); v7_exec的最后一个参数用于获取JavaScript表达式的结果。我们会忽略这一点。 JavaScript和设备 太棒了!我们成功地运行了一些JavaScript代码! 但是,我们如何让JavaScript代码在设备上做一些有用的事情呢?V7只是一个通用的JS VM库,它不知道你的嵌入式板,它的API等等。 让我们首先编写一个简单的JS脚本,它使用两个简单的函数,我们将从我们的设备的SDK导出: while(true) { setLed(false); wait(0.2); setLed(true); wait(0.8); } 我们可以用v7_exec内嵌调用它,或者从flash存储的文件加载它,或者从网络下载它: v7_exec(v7, "while(true) {" \ " setLed(false);" \ " wait(0.5); " \ " setLed(true);" \ " wait(0.5); " \ "}", NULL); 因此,让我们注册一些函数,使我们能够与手头的SDK交互: v7_set_method(v7, v7_get_global(v7), "setLed", &js_set_led); v7_set_method(v7, v7_get_global(v7), "wait", &js_wait); 这段代码注册了两个全局JavaScript函数,setLed和wait,可以从脚本中调用它们,就像它们是本地函数一样。 它们的实现是用c语言编写的,让我们通过仔细观察js_wait是如何实现的来看看它是如何工作的: enum v7_err js_wait(struct v7 *v7, v7_val_t *res) { wait(v7_get_double(v7, v7_arg(v7, 0))); return V7_OK; } v7_arg(v7,0):接受传递给wait()的第一个参数。它返回一个v7_val_t值,该值表示一个通用JavaScript值。 v7_get_double(v7, val):从v7_val_t中提取C双浮点值 您可以在这里阅读关于V7 API的更多信息。 代码 嵌入JavaScript 嵌入式JavaScript引擎的C/ c++ ——请看附件1; ![]() |
感谢楼主,学习了。。。 |
有点黑科技![]() |