概述

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

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

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

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

    1. 动态模块:它更多的是一个 ELF 格式加载器,把单独编译的一个 elf 文件的代码段,数据段加载到内存中,并对其中的符号进行解析,绑定到导出的 API 地址上。因为也独立于固件编译,支持动态加载。不过需要编译一份支持动态模块执行的固件。
    2. 胶水语言(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的主要特征有:
  1. 完全符合ECMAScript 5.1标准;
  2. 为ARM Thumb-2编译时,二进制大小为160K;
  3. 针对低内存消耗进行了高度优化;
  4. 以C99编写,以实现最大的便携性;
  5. 快照支持将JavaScript源代码预编译为字节代码;
  6. 成熟的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语法

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

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

  3. 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;
}
  1. 因为我们还没搭建文件系统所以不能存放XXX.js文件,我们先通过字符串的形式模拟文件内容。
char *script_test = " var rice = \"Rice JerryScript\"\r\n"" console.log(\"hello!!\", rice);\r\n"" console.log(\"hello JerryScript run ok!!\"); \r\n";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=%d\n", __func__, ret2);}
}
MSH_CMD_EXPORT(js_parse_test, js_parse_test);
  1. 编译运行结果:

以文件的形式加载JS语法

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

  • 增加Ymodem组件:

  1. 文件系统挂在,我使用的板子有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);
  1. 编写JS应用文件–rice.js
  • rice.js文件内容:
var rice = "Rice JerryScript";console.log("hello!!", rice);
console.log("hello JerryScript run ok!!");
  1. 通过Ymodem传输到板子中,我使用的串口工具–XShell,它自带Ymodem组件,所以可以直接传输,流程:
  • 在串口中断输入ry,使单片机进入Ymodem接收模式:

  • 然后选择Ymodem发送文件:


  1. 编写使用文件运行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=%d\n", __func__, ret);}
}
MSH_CMD_EXPORT(js_parse_test, js_parse_test);
  1. 编译运行结果:

总结

  1. 采用胶水语言,可以减少对固件的修改,应用的变更不会导致固件的变更,而且修改方便快捷。
  2. 通过JavaScript,嵌入式研发人员,也慢慢变成类前后端开发模式,这样职责更加清晰。
  3. JavaScript的运行如上,下一篇将讲解C接口方法如何提供给JavaScript应用使用。

关注微信公众号『Rice嵌入式开发技术分享』,后台回复“微信”添加作者微信,备注”入群“,便可邀请进入技术交流群。

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

  1. c8051f c语言编程,C8051F系列单片机开发与C语言编程

    C8051F系列单片机开发与C语言编程 维普资讯 http://doc.xuehai.net 雎 A 21进行控制,这样可以选择不同的地址,进而控制的读写. S D1 5 E 6对应的内存和寄存器. ...

  2. 百问网七天物联网课程学习笔记——单片机开发模式

    单片机有几种不同的开发模式,即:寄存器开发.C语言裸机开发以及使用实时操作系统进行. 1.使用寄存器开发单片机程序,分为使用汇编指令操作寄存器以及使用C语言操作寄存器两种.该方法有着无与伦比的效率提升 ...

  3. mdin偏移_dif_input.c 源代码在线查看 - C8051F系列单片机开发与C语言编程 非常好的东西 资源下载 虫虫电子下载站...

    //差动输入,定时启动,由T2定时/选择6,7通道为ADC0差动转化通道,其中第6通道为P3.6,第7通道为P.7dif_input.c///#include "lcd.h"//笔 ...

  4. 单片机cant通讯 c语言,基于C8051F040单片机的CAN总线通信

    硬件部分 硬件部分电路结构如下: CAN收发模块原本采用的是ATA6660高速CAN收发芯片,电路连接如下: 设计电路为:当单片机发送数据时,D18闪烁,并将数据传送给ATA6660芯片:当ATA66 ...

  5. 学单片机需要多少C语言基础,C语言单片机编程教程

    很多学员和朋友经常找我给他们推荐C语言的书,他们可能想和我当年一样,闷头大干一场,学个几个月的C语言,把C语言吃透,再开始单片机程序开发! 别!别!别! 大家千万别这么干,我当年自学了3个月的C语言, ...

  6. c语言使单片机输出低电平,单片机开发中的一些实用技巧

    很多朋友正在学习单片机开发技术,但开发中免不了要碰到这样.那样的问题,有些问题可能无碍大局,但有一些问题却直接影响到产品的成本.体积.性能.这里介绍笔者的几个技巧,希望对大家的工作有帮助. 一.C语言 ...

  7. 单片机学c语言还是python好_单片机开发用哪种语言最好?

    在过去的几十年中,单片机的规格变化不大,但是语言和支持软件的扩展为应用程序开发开辟了许多途径.多年来,对单片机进行编程涉及到两种语言的选择:C语言和汇编语言.但是随着现在可用于微处理器的新语言,用户在 ...

  8. uml+oopc嵌入式c语言开发精讲_新的程序开发模式出现,传统的嵌入式C语言程序员快要灭绝了?...

    来源:嵌入式时代@头条号 在2000年前后,嵌入式软件工程师有着一套非常具体的技能,他们通常是电气工程师,不仅了解底层硬件的工作原理,还可以在底层编写汇编代码或者C语言代码,以使系统满足实时需求.嵌入 ...

  9. 单片机c语言编程教学大纲,9C语言单片机开发技术教学大纲(16学时)新.doc

    9C语言单片机开发技术教学大纲(16学时)新 <C语言单片机开发技术>课程教学大纲 课程代码:010142061 课程英文名称:Development technology of C la ...

最新文章

  1. FF小股东美国起诉恒大 要求收回中国公司控制权
  2. 10次相遇我才知道什么是成熟的爱--转
  3. php如何替换 前的空格,php空格如何替换
  4. TLS1.3握手流程以及参数详解
  5. centos升级之vim vim8.0安装
  6. 好企业:不是走得多快而是走得多稳
  7. 在浏览器中执行Kettle job或者transformation
  8. 【编辑器】vscode修改背景图片的插件们
  9. ROS的学习(二十)rosserial中的Publisher和Subscriber中的编程步骤
  10. RabbitMQ(二)
  11. 江苏高中考计算机,【江苏985录取率】_各省高考985录取率排名,江苏最让人“心疼”,倒数第二...
  12. win10系统怎样安装/更新独立显卡驱动
  13. 立创商城PCB库下载(SVN更新)
  14. 3D打印机内网联机打印(1)orangpiPlus安装Octoprint
  15. Adb使用教程,看了教程后你也是玩机达人啦
  16. 《用户至上:用户研究方法与实践(原书第2版)》一3.1 概述
  17. DevOps工程师主要负责哪些事?需要具备哪些技能?
  18. 人工蜂群算法python_python实现人工蜂群算法
  19. ##MYfirstLog
  20. 深入理解Java虚拟机(周志明第三版)- 第八章:虚拟机字节码执行引擎

热门文章

  1. 计算机二级课程论文摘要,摘要、论文格式概念.doc
  2. redo log日志
  3. 国家地理信息公共服务平台:平台还是软件?
  4. 在 2020,什么工具能取代 Evernote 印象笔记?
  5. 第七章 面向对象核心技术
  6. mysql binlog xid_解析MYSQL BINLOG 二进制格式(7)--Xid_log_event/XID_EVENT
  7. Kali-加密文档Office破解-hashcat(字典)
  8. 【Exception】Navicat连接Oracle闪退 Navicat连接Oracle 报错:connection to server failed,probable Oracle Net admi
  9. Java查找字符串中子串
  10. 轻松写出爆文的好工具