你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

使用mbed在STM32上运行JavaScript

[复制链接]
STMCU 发布时间:2019-2-25 15:16
主题

为了让LED亮起来,编写一个小JavaScript脚本,整个过程主要通过ARM mbed C HAL函数的交互实现的。
同时也适用于ARM mbed支持的其他系统。

前提

在嵌入式MCU中添加脚本功能的原因有很多。 这次主要是想把JavaScript VM嵌入到他们现有的C固件,以便于快速定制核心业务逻辑,而不必重新包装设备。 这次我选择的嵌入式JavaScript VM是V7,这款是我和我在Cesanta的队友共同开发的。 V7库仅作为两个文件分发:V7 .c和V7 .h,你只需在项目中导入这两个文件就可以了。 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);" \

你可以直接在ARM mbed在线编译器或命令行工具中复制这个代码,打开:http://developer.mbed.org/teams ... 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代码库中,这样更方便。

1.jpg

或者,如果直接使用命令行工具:


现在,库已经被构建到固件中,但还需要它的数据头:
#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内联调用它,或者从闪存上的文件加载它,或者从网络下载它:

v7_exec(v7,
         "while(true) {" \
         "  setLed(false);" \
         "  wait(0.2); " \
         "  setLed(true);" \
         "  wait(0.8); " \
         "}",
         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双浮点值

一个物联网固件开发框架。支持单片机:ESP32, ESP8266, CC3220, CC3200, STM32F4, STM32L4, STM32F7。亚马逊AWS物联网、微软Azure、谷歌物联网核心集成。用C或JavaScript编写的代码。——阅读更多 http://mongoose-os.com

mongoose-os-master.zip (2.2 MB, 下载次数: 13)
收藏 评论1 发布时间:2019-2-25 15:16

举报

1个回答
JENKEY-152055 回答时间:2020-6-6 22:13:47
学习一下

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似分享

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版