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

概述
传统的嵌入式单片机开发基本上形式如下图:
该流程对于功能单一或者功能变更极少的场景是比较友好的,但是对于设备应用层变更比较多或者公板方案开发应用的场景,上述场景显的有些累赘。那么有什么方式可以解决呢??
对于设备应用层变更比较多或者公板方案开发应用的场景,可能因为应用层稍微修改一下就要出固件版本验证,这对于版本管理,时间周期,固件质量都是比较不友好的。那么我们如何避免这些问题??
那么有什么方式呢??答案是有的,如:使用动态模块或者胶水语言(jerryscript,pikascript)
动态模块:它更多的是一个 elf 格式加载器,把单独编译的一个 elf 文件的代码段,数据段加载到内存中,并对其中的符号进行解析,绑定到导出的 api 地址上。因为也独立于固件编译,支持动态加载。不过需要编译一份支持动态模块执行的固件。
胶水语言(jerryscript,pikascript):其实就是脚本语言,应用将以脚本语言的形式存在,通过动态加载脚本语言执行。不过固件需要对应胶水语言的执行引擎。
上述两种方式都是可以使固件跟应用分离,是的应用的变更不会引起固件的变更,这对于固件的稳定性来说更加有保障。只需要测试单独的应用程序。
动态模块相对于胶水语言来说,明显优势不高,对比:
  动态模块 胶水语言
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-thread,openharmony等厂商。而且jerryscript被默认作为第三方组件的形式存在。所以我将以rt-thread作为我的开发环境描述javascript如何在单片机中运行。
以字符串形式加载js语法
rt-thread中已经拥有jerryscript软件包,所以我们需要下载对应软件包即可:
rt-threaad的jerryscript已经适配好了,如console打印等,所以我们也不用关心,直接使用。需要包含两个头文件:#include 和#include
jerryscript引擎启动流程(初始化):
int main(void){    /* jerry_enable_external_context */    jerry_port_set_default_context(jerry_create_context(pkg_jmem_heap_size * 1024, context_alloc, null));    /* initialize engine */    jerry_init(jerry_init_empty);    js_util_init();    return rt_eok;}  
因为我们还没搭建文件系统所以不能存放xxx.js文件,我们先通过字符串的形式模拟文件内容。
char *script_test =          var rice = rice jerryscriptrn         console.log(hello!!, rice);rn         console.log(hello jerryscript run ok!!); rn;void js_parse_test(void){    jerry_value_t parsed_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(jerry parse failed!n);    }    else    {        jerry_value_t ret2 = jerry_run(parsed_code);        rt_kprintf(%s : jerry_run ret=%dn, __func__, ret2);    }}msh_cmd_export(js_parse_test, js_parse_test);  
编译运行结果:
以文件的形式加载js语法
需要增加文件系统及ymodem,其中文件系统用来存放js文件,ymodem用于把文件传输。
增加文件系统组件:
增加ymodem组件:
文件系统挂载,我使用的板子有spi flash,所以文件系统直接挂载到此flash中:
int mnt_init(void){      if (dfs_mount(w25q256, /, elm, 0, 0) == 0)    {        log_i(w25q256 mount successful!);    }    else    {        log_e(w25q256 mount failed!);        dfs_mkfs(elm, w25q256);        if (dfs_mount(w25q256, /, elm, 0, 0) == 0)        {            log_i(w25q256 mount successful!);        }    }    return 0;}init_env_export(mnt_init);  
编写js应用文件--rice.js
rice.js文件内容:
var rice = rice jerryscript;console.log(hello!!, rice);console.log(hello jerryscript run ok!!);  
通过ymodem传输到板子中,我使用的串口工具--xshell,它自带ymodem组件,所以可以直接传输,流程:
在串口中断输入ry,使单片机进入ymodem接收模式:
然后选择ymodem发送文件:
编写使用文件运行js应用的代码:
void js_parse_test(void){    int fd = -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);  
编译运行结果:
总结
采用胶水语言,可以减少对固件的修改,应用的变更不会导致固件的变更,而且修改方便快捷。
通过javascript,嵌入式研发人员,也慢慢变成类前后端开发模式,这样职责更加清晰。
javascript的运行如上,下一篇将讲解c接口方法如何提供给javascript应用使用。

新能源汽车无线充电技术的应用
物联网技术在建筑行业的优势分析
实例介绍如何使用STM32开发工具Keil建立工程
中国石化与晶瑞电材合作推动集成电路用异丙醇国产化
表面清洁度检测仪有效解决喷涂NPT聚脲磨防腐材料起皮、脱落现象的原因分析和处理办法
打破单片机开发模式--胶水语言(JavaScript)
微型热保护器在工业电伴热保温套的应用
中京电子与江铜耶兹签署了长期供货合作签约
致态新旗舰TiPlus5000上市,性能得到大幅提升
怎么让机器理解“什么是公平”
基于深度学习的图像边缘和轮廓提取方案解析
MCU芯片的概念和特点 MCU芯片的结构和应用
如何预防电动机烧毁
丘钛科技发布2018年业绩报告,称2018年全年实现收入81.35亿元
智能楼宇lora芯片ASR6601是一种通用的LPWAN无线通信SoC 32位RISC单片机
MAX664引脚配置与内部框图
黑芝麻智能能否成为中国自动驾驶芯片第一股?
超微晶磁芯及其在开关电源中的应用
电源拓扑结构应该如何选择?
GSMA:2021年5G规模化基建还将继续推进