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

来尝试使用mbed在STM32上运行JavaScript

[复制链接]
木木&点点 发布时间:2018-11-22 12:52
首先为ARM单片机添加脚本。这个项目在STM32F469I-DISCO电路板上运行V7 JavaScript VM,并向JS公开两个ARM mbed SDK调用。
图片2.png
项目中使用的东西
硬件组件
意法半导体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代码库中,因此将它们添加到项目中并获得更新更容易。
图片3.png
     或者,如果您使用命令行工具:
     现在,库将被构建到您的固件中。但为了使用它,你需要包括它的标题:
#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;
v7-master.zip (1.36 MB, 下载次数: 2)
收藏 1 评论2 发布时间:2018-11-22 12:52

举报

2个回答
月如意 回答时间:2018-11-22 14:33:49
感谢楼主,学习了。。。
wbnorth 回答时间:2018-11-22 17:25:50
有点黑科技
2 Y' x' x/ L$ f* u NUCLEO_L432KC_01.jpg 2 o: x, A, f0 Z  a$ Z

所属标签

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