0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

打破单片机开发模式--胶水语言(JavaScript)

Rice嵌入式开发技术分享 来源:Rice嵌入式开发技术分享 作者:Rice嵌入式开发技术 2023-03-07 17:33 次阅读

概述

传统的嵌入式单片机开发基本上形式如下图:

984ed7a2-b833-11ed-a826-dac502259ad0.png

该流程对于功能单一或者功能变更极少的场景是比较友好的,但是对于设备应用层变更比较多或者公板方案开发应用的场景,上述场景显的有些累赘。那么有什么方式可以解决呢??

对于设备应用层变更比较多或者公板方案开发应用的场景,可能因为应用层稍微修改一下就要出固件版本验证,这对于版本管理,时间周期,固件质量都是比较不友好的。那么我们如何避免这些问题??

那么有什么方式呢??答案是有的,如:使用动态模块或者胶水语言(JerryScript,PikaScript)

动态模块:它更多的是一个 ELF 格式加载器,把单独编译的一个 elf 文件的代码段,数据段加载到内存中,并对其中的符号进行解析,绑定到导出的 API 地址上。因为也独立于固件编译,支持动态加载。不过需要编译一份支持动态模块执行的固件。

胶水语言(JerryScript,PikaScript):其实就是脚本语言,应用将以脚本语言的形式存在,通过动态加载脚本语言执行。不过固件需要对应胶水语言的执行引擎。

上述两种方式都是可以使固件跟应用分离,是的应用的变更不会引起固件的变更,这对于固件的稳定性来说更加有保障。只需要测试单独的应用程序。

9877c7ca-b833-11ed-a826-dac502259ad0.png

动态模块相对于胶水语言来说,明显优势不高,对比:

动态模块 胶水语言
API问题 运行固件需要特殊处理,需要将API导出 通过对应的引擎编写API导出模块
应用形式 应用程序需要通过固件编译出对应的ELF文件 胶水语言无需编译,直接可通过对应引擎加载运行

很明显,作者倾向于胶水来改变开发模式,那么使用哪种胶水语言呢??目前轻量级的胶水语言,有JerryScript,PikaScript。我们该如何选择??

JerryScript PikaScript
资源占用 RAM <= 64KB, Flash <= 200KB RAM <= 4KB, Flash <= 32KB
语言 JavaScript Python
地域 海外 中国
维护情况 停止维护 持续维护
开发对象 懂得前端的人员也可以接手嵌入式应用开发 需要熟悉python语言
开发难度 一般 一般
使用情况 UI厂商都是用,柿饼,ACE 相对较少

两种胶水语言各有各的优势,我的选择是根据使用场景,开发人员的角度,所以选择JerryScript来解决我开发的困扰及问题。

JerryScript

物联网设备在CPU性能和内存空间方面皆存在严格受限,在使用V8引擎这类大型引擎时难免存在诸多不便。在此背景下,JerryScript引擎诞生了。JerryScript是由三星开发的一款炙手可热的轻量级引擎,其目的是让JavaScript开发者能够更好地构建物联网应用,JerryScript是一个轻量级的JavaScript引擎,用于资源受限的设备,如微控制器。它可以在RAM小于64KB、闪存小于200KB的设备上运行。

JerryScript的主要特征有:

完全符合ECMAScript 5.1标准;

ARM Thumb-2编译时,二进制大小为160K;

针对低内存消耗进行了高度优化;

以C99编写,以实现最大的便携性;

快照支持将JavaScript源代码预编译为字节代码;

成熟的C API,易于嵌入应用程序。

JerryScript文档说明:

英文 中文 链接
Getting Started 入门 https://github.com/jerryscript-project/jerryscript/blob/master/docs/00.GETTING-STARTED.md
Configuration 配置 https://github.com/jerryscript-project/jerryscript/blob/master/docs/01.CONFIGURATION.md
API Reference API参考 https://github.com/jerryscript-project/jerryscript/blob/master/docs/02.API-REFERENCE.md
API Example API示例 https://github.com/jerryscript-project/jerryscript/blob/master/docs/03.API-EXAMPLE.md
Internals 内部构件 https://github.com/jerryscript-project/jerryscript/blob/master/docs/04.INTERNALS.md
Migration Guide 迁移指南 https://github.com/jerryscript-project/jerryscript/blob/master/docs/16.MIGRATION-GUIDE.md

JerryScript使用

目前很多UI厂商都在基于JerryScript作为引擎搭建UI框架,比如像RT-THREADOpenHarmony等厂商。而且JerryScript被默认作为第三方组件的形式存在。所以我将以RT-THREAD作为我的开发环境描述JavaScript如何在单片机中运行。

以字符串形式加载JS语法

RT-THREAD中已经拥有JerryScript软件包,所以我们需要下载对应软件包即可:

98870546-b833-11ed-a826-dac502259ad0.png

RT-THREAAD的JerryScript已经适配好了,如console打印等,所以我们也不用关心,直接使用。需要包含两个头文件:#include 和#include

JerryScript引擎启动流程(初始化):

intmain(void)
{
/*JERRY_ENABLE_EXTERNAL_CONTEXT*/
jerry_port_set_default_context(jerry_create_context(PKG_JMEM_HEAP_SIZE*1024,context_alloc,NULL));

/*Initializeengine*/
jerry_init(JERRY_INIT_EMPTY);

js_util_init();
returnRT_EOK;
}

因为我们还没搭建文件系统所以不能存放XXX.js文件,我们先通过字符串的形式模拟文件内容。

char*script_test=
"varrice="RiceJerryScript"rn"
"console.log("hello!!",rice);rn"
"console.log("helloJerryScriptrunok!!");rn";

voidjs_parse_test(void)
{
jerry_value_tparsed_code=jerry_parse(NULL,0,(jerry_char_t*)script_test,
rt_strlen(script_test),JERRY_PARSE_NO_OPTS);
if(jerry_value_is_error(parsed_code))
{
rt_kprintf("jerryparsefailed!n");
}
else
{
jerry_value_tret2=jerry_run(parsed_code);
rt_kprintf("%s:jerry_runret=%dn",__func__,ret2);
}
}
MSH_CMD_EXPORT(js_parse_test,js_parse_test);

编译运行结果:

98a7841a-b833-11ed-a826-dac502259ad0.png

以文件的形式加载JS语法

需要增加文件系统及Ymodem,其中文件系统用来存放js文件,Ymodem用于把文件传输。

增加文件系统组件:

99240fc6-b833-11ed-a826-dac502259ad0.png

增加Ymodem组件:

9965856e-b833-11ed-a826-dac502259ad0.png

文件系统挂载,我使用的板子有spi flash,所以文件系统直接挂载到此flash中:

intmnt_init(void)
{
if(dfs_mount("W25Q256","/","elm",0,0)==0)
{
LOG_I("W25Q256mountsuccessful!");
}
else
{
LOG_E("W25Q256mountfailed!");
dfs_mkfs("elm","W25Q256");
if(dfs_mount("W25Q256","/","elm",0,0)==0)
{
LOG_I("W25Q256mountsuccessful!");
}
}
return0;
}
INIT_ENV_EXPORT(mnt_init);

编写JS应用文件--rice.js

rice.js文件内容:

varrice="RiceJerryScript";

console.log("hello!!",rice);
console.log("helloJerryScriptrunok!!");

通过Ymodem传输到板子中,我使用的串口工具--XShell,它自带Ymodem组件,所以可以直接传输,流程:

在串口中断输入ry,使单片机进入Ymodem接收模式:

99834928-b833-11ed-a826-dac502259ad0.png

然后选择Ymodem发送文件:

99b35b5e-b833-11ed-a826-dac502259ad0.png99d5b424-b833-11ed-a826-dac502259ad0.png

编写使用文件运行JS应用的代码:

voidjs_parse_test(void)
{
intfd=-1,fileSize=0;
char*fileContent=NULL;

fd=open("/rice.js",O_RDONLY,0777);
if(fd< 0) {
        rt_kprintf("Open %s failed", "/rice.js");
        return;
    } else {
        fileSize = lseek(fd, 0, SEEK_END);
        lseek(fd, 0, SEEK_SET);
        fileContent = (char *)rt_malloc(fileSize); 
        read(fd, fileContent, fileSize);
        close(fd);
        fd = -1;
  }
 
 jerry_value_t parsed_code = jerry_parse((const jerry_char_t *)"/rice.js", (size_t)strlen("/rice.js"), 
                                               (const jerry_char_t *)fileContent, (size_t)fileSize, 
                                               JERRY_PARSE_STRICT_MODE);
    if (jerry_value_is_error(parsed_code))
    {
        rt_kprintf("jerry parse failed!n");
    }
    else
    {
        jerry_value_t ret = jerry_run(parsed_code);
        rt_kprintf("%s : jerry_run ret=%dn", __func__, ret);
    }                   
}
MSH_CMD_EXPORT(js_parse_test, js_parse_test);

编译运行结果:

99f0fe28-b833-11ed-a826-dac502259ad0.png

总结

采用胶水语言,可以减少对固件的修改,应用的变更不会导致固件的变更,而且修改方便快捷。

通过JavaScript,嵌入式研发人员,也慢慢变成类前后端开发模式,这样职责更加清晰。

JavaScript的运行如上,下一篇将讲解C接口方法如何提供给JavaScript应用使用。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6032

    文章

    44513

    浏览量

    632680
  • API
    API
    +关注

    关注

    2

    文章

    1483

    浏览量

    61795
  • 嵌入式开发
    +关注

    关注

    18

    文章

    1021

    浏览量

    47505
  • javascript
    +关注

    关注

    0

    文章

    516

    浏览量

    53787
  • RICE
    +关注

    关注

    0

    文章

    2

    浏览量

    1754
收藏 人收藏

    评论

    相关推荐

    嵌入式新开发模式(JavaScript)--C端与JS端方法调用

    应用在嵌入式设备的存在形式(字符串,文件)。 打破单片机开发模式--胶水语言(
    的头像 发表于 04-06 15:39 829次阅读

    单片机的编程语言开发环境

    在《嵌入式编程之单片机的基本构成、工作原理》和《嵌入式编程之单片机的外围功能电路》我们介绍了单片机硬件方面的知识。本文将介绍单片机开发环境
    发表于 08-11 10:47 5531次阅读

    8051单片机C语言开发环境实务与设计

    8051单片机C语言开发环境实务与设计从基础出发,循序渐进地介绍8051单片机的C语言程序开发
    发表于 10-08 21:28 0次下载
    8051<b class='flag-5'>单片机</b>C<b class='flag-5'>语言</b><b class='flag-5'>开发</b>环境实务与设计

    单片机c语言轻松入门

    单片机c语言轻松入门:随着单片机开发技术的不断发展,目前已有越来越多的人从普遍使用汇编语言到逐渐使用高级
    发表于 10-09 10:19 200次下载

    51单片机及其C语言程序开发实例

    51单片机及其C语言程序开发实例:很详细,很全面的电子书实例教程。
    发表于 01-03 17:25 255次下载

    单片机的C语言轻松入门

    随着单片机开发技术的不断发展,目前已有越来越多的人从普遍使用汇编语言到逐渐使用高级语言开发,其中主要是以C
    发表于 12-17 21:23 489次下载

    C语言单片机开发中的应用

    C语言单片机开发中的应用 在单片机开发应用中,已逐渐开始引入高级语言,C
    发表于 04-07 13:59 1134次阅读

    单片机开发技巧

    一、 如何提高C语言编程代码的效率邓宏杰指出,用C语言进行单片机程序设计是单片机开发与应用的必然趋势。他强调:“如果使用C编程时,要达到最高
    发表于 06-29 18:24 825次阅读

    单片机C语言编程与实例

    单片机C语言编程与实例 学习单片机开发非常不错的资料。
    发表于 01-11 14:50 42次下载

    8051单片机C语言软件设计8051单片机C语言软件设计

    8051单片机C语言软件设计8051单片机C语言软件设计
    发表于 10-16 11:25 92次下载
    8051<b class='flag-5'>单片机</b>C<b class='flag-5'>语言</b>软件设计8051<b class='flag-5'>单片机</b>C<b class='flag-5'>语言</b>软件设计

    单片机程序开发语言怎么选择

    单片机程序的开发可以使用的两种语言,分别是C语言和汇编语言。这里要指出的一件事是,这不是嵌入式单片机
    的头像 发表于 06-29 11:22 3475次阅读

    JavaScript JavaScript是什么语言

    JavaScript是属于开发Web页面的脚本编程语言,是一种具有函数优先的轻量级编程语言JavaScript基于原型编程、多范式的动态脚
    的头像 发表于 07-27 15:41 6601次阅读

    51单片机-PASCAL语言开发环境搭建

    51单片机-PASCAL语言开发环境搭建
    发表于 11-23 16:36 12次下载
    51<b class='flag-5'>单片机</b>-PASCAL<b class='flag-5'>语言</b><b class='flag-5'>开发</b>环境搭建

    单片机的c语言入门指南

    随着单片机开发技术的不断发展,目前已有越来越多的人从普遍使用汇编语言到逐渐使 用高级语言开发,其中主要是以 C
    发表于 07-07 14:34 6次下载

    你用过哪些编程语言开发单片机

    C语言是最常用的一种用于单片机开发语言,也是一种高级编程语言,具有较好的可移植性和可读性。对于单片机
    发表于 12-04 10:18 1271次阅读