<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
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-THREAD,OpenHarmony等廠商。而且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

編譯運行結果:

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

總結

采用膠水語言,可以減少對固件的修改,應用的變更不會導致固件的變更,而且修改方便快捷。

通過JavaScript,嵌入式研發人員,也慢慢變成類前后端開發模式,這樣職責更加清晰。

JavaScript的運行如上,下一篇將講解C接口方法如何提供給JavaScript應用使用。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6008

    文章

    44062

    瀏覽量

    622642
  • API
    API
    +關注

    關注

    2

    文章

    1410

    瀏覽量

    61093
  • 嵌入式開發
    +關注

    關注

    18

    文章

    984

    瀏覽量

    47064
  • javascript
    +關注

    關注

    0

    文章

    512

    瀏覽量

    53463
  • RICE
    +關注

    關注

    0

    文章

    2

    瀏覽量

    1738
收藏 人收藏

    評論

    相關推薦

    嵌入式新開發模式(JavaScript)--C端與JS端方法調用

    應用在嵌入式設備的存在形式(字符串,文件)。 打破單片機開發模式--膠水語言(
    的頭像 發表于 04-06 15:39 ?664次閱讀

    單片機的C 語言輕松入門

    單片機的C 語言輕松入門單片機的C 語言輕松入門隨著單片機開發技術的不斷發展,目前已有越來越多的
    發表于 09-09 14:14

    avr單片機C語言開發入門指導

    avr單片機C語言開發入門指導本書介紹了ICCAVR編譯器使用C語言的有關知識,也穿插介紹ICCAVR與常用的其他C編譯器使用C語言的一些異
    發表于 03-19 21:24

    單片機開發300問】單片機開發一定要會C語言嗎?

    單片機開發一定要會C語言嗎?匯編語言是一種用文字助記符來表示機器指令的符號語言,是最接近機器碼的一種語言
    發表于 11-16 16:45

    keil 單片機C語言開發教程

    keil單片機C語言開發教程[hide][/hide]
    發表于 12-31 21:53

    MicroPython+STM32開發板:用Python語言控制單片機

    Python寫的;可以做網絡游戲的后臺,很多在線游戲的后臺都是Python開發的??傊痪湓捑褪悄芨珊芏嗪芏嗟氖虑槔?!MicroPython+STM32開發板:用Python語言控制單片機
    發表于 09-20 17:19

    AVR單片機C語言開發入門指導

    AVR單片機C語言開發入門指導,PDF文檔,希望對大家有用 AVR單片機C語言開發入門指導.p
    發表于 07-03 09:32

    C語言單片機編程使用的高級語言

    語言的優勢更能得到發揮。使用C語言編程的單片機芯片執行速度的問題,配合英銳恩推出的開發工具仿真器,找出關鍵代碼,進一步用人工優化,可以達到十分滿意的程度。
    發表于 10-20 16:38

    嵌入式C語言單片機開發

    想學好嵌入式首先要掌握好C語言編程和單片機開發,這兩個都不會的話就要從C語言學起了,然后逐漸學習單片機和linux這些。
    發表于 08-11 09:19

    常用單片機開發模式

    單片機開發的過程肯定是需要單片機開發工具的支持的,進行程序的調試等是單片機開發過程更加順暢,縮短
    發表于 11-19 06:09

    使用C語言進行單片機開發

    前言:單片機開發也是可以使用C語言的,但是需要使用keil軟件將C語言生成的單片機可以直接執行的hex文件軟件安裝:51的
    發表于 11-19 08:13

    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語言單片機開發中的應用 在單片機開發應用中,已逐漸開始引入高級語言,C
    發表于 04-07 13:59 ?1091次閱讀

    JavaScript JavaScript是什么語言

    JavaScript是屬于開發Web頁面的腳本編程語言,是一種具有函數優先的輕量級編程語言。JavaScript基于原型編程、多范式的動態腳
    的頭像 發表于 07-27 15:41 ?6226次閱讀

    你用過哪些編程語言開發單片機?

    C語言是最常用的一種用于單片機開發語言,也是一種高級編程語言,具有較好的可移植性和可讀性。對于單片機
    發表于 12-04 10:18 ?448次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>