0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

嵌入式新開發(fā)模式(JavaScript)--C端與JS端方法調(diào)用

Rice嵌入式開發(fā)技術(shù)分享 ? 2023-04-06 15:39 ? 次閱讀

概述

  • 上一篇我們描述了為什么我們要使用膠水語言(JavaScript,PikaScript)來改變我們的嵌入式開發(fā)模式。并描述了如何在嵌入式設(shè)備拉起JavaScript應(yīng)用及JavaScript應(yīng)用在嵌入式設(shè)備的存在形式(字符串,文件)。

打破單片機(jī)開發(fā)模式--膠水語言(JavaScript)

  • 膠水語言可以讓我們職責(zé)更加明確,可以類前后端開發(fā)模式,后端負(fù)責(zé)--硬件的適配,方法的導(dǎo)出;前端負(fù)責(zé)--業(yè)務(wù)邏輯的的開發(fā)。

  • 本篇文章作者來介紹JS在嵌入式設(shè)備上的如何使用,我們通過一下幾點(diǎn)說明:

  1. C端如何導(dǎo)出方法提供給到JS端;
  2. C端如何導(dǎo)出參數(shù)提供給JS端;
  3. 通過C端導(dǎo)出方法,JS端控制LED燈;
  • 在使用JerryScript引擎實(shí)現(xiàn)C端與JavaScript端交互時,許喲啊弄清楚幾個概念:

類型 說明
object 對象,JerryScript是基于對象編程的,所以我們導(dǎo)出的方法都是對象的基礎(chǔ)上的
property 特性,如導(dǎo)出的參數(shù),函數(shù)等,都屬于特性,歸屬于某個對象的特性
value 值,在JerryScript中,所有的對象,特性,參數(shù),方法,都會轉(zhuǎn)為一個32位的數(shù)值,然后我們通過這個數(shù)值便可以訪問對應(yīng)內(nèi)容

C端如何導(dǎo)出方法提供給到JS端

  • 在JavaScript的引擎(JerryScript)中,提供了很多方法供我們實(shí)現(xiàn)C端與JS端的交互,C端導(dǎo)出模塊也是依賴這些方法的。
  • 那么如何從C端導(dǎo)出方法呢???為了更好的演示,我們通過從C端導(dǎo)出一個日志打印方法提供給到JS應(yīng)用使用,并在JS應(yīng)用中驗(yàn)證。
  • 導(dǎo)出的方法我們需要遵從模板,其中我們要關(guān)注的參數(shù):
  1. this_val:自身對象值。
  2. args_p[]:JS調(diào)用導(dǎo)出方法接口時的參數(shù)列表。
  3. args_count:JS調(diào)用導(dǎo)出方法接口時的參數(shù)個數(shù)。
typedefjerry_value_t(*jerry_external_handler_t)(constjerry_value_tfunction_obj,
constjerry_value_tthis_val,
constjerry_value_targs_p[],
constjerry_length_targs_count);
  • 日志打印方法編寫(log_handle):
  1. 日志打印接口只需要一個輸入?yún)?shù),并且這個參數(shù)類型位字符串(string),所以我們只需要處理一個入?yún)ⅲ?/li>
  2. 前面我們已經(jīng)描述了:在JerryScript中,所有的對象,特性,參數(shù),方法,都會轉(zhuǎn)為一個32位的數(shù)值,所以我們需要將參數(shù)值解析出來;
  3. 通過jerry_value_to_string方法將args[0]轉(zhuǎn)為字符串?dāng)?shù)值(str_value);
  4. 通過jerry_string_to_utf8_char_buffer方法從字符串?dāng)?shù)值(str_value)獲取字符串內(nèi)容;
  5. 提取完數(shù)據(jù)之后,需要調(diào)用jerry_release_value方法,將字符串?dāng)?shù)值(str_value)資源釋放;
  6. 將提取的內(nèi)容打印出來;
staticjerry_value_tlog_handler(constjerry_value_tfunction_obj,
constjerry_value_tthis_val,
constjerry_value_targs[],
constjerry_length_targCount)
{
jerry_size_tlog_len=0;
jerry_value_tstr_value=jerry_value_to_string(args[0]);
log_len=jerry_string_to_utf8_char_buffer(str_value,log_buff,(LOG_BUFF_LEN-1));
log_buff[log_len]='';
jerry_release_value(str_value);

rt_kprintf("%srn",(constchar*)log_buff);
returnjerry_create_undefined();
}
  • 導(dǎo)出log_handle方法;
  1. 通過jerry_get_global_object方法獲取全局對象;
  2. 通過jerry_create_external_function創(chuàng)建外部函數(shù)(log_handle)對象;
  3. 我們提供給js應(yīng)用調(diào)用的方法,需要導(dǎo)出一個方法名(log),通過jerry_create_string_from_utf8方法創(chuàng)建一個字符串("log")對象;
  4. 通過jerry_set_property方法,導(dǎo)出一個名為log的方法;
  5. 導(dǎo)出完所有l(wèi)og方法之后,需要將其使用的對象值全部釋放;
staticvoidjs_func_init(void)
{
jerry_value_tglobal_object=jerry_get_global_object();

jerry_value_tfunc=jerry_create_external_function(log_handler);
jerry_value_tproperty_name_val=jerry_create_string_from_utf8((constjerry_char_t*)"log");
jerry_value_tresult_val=jerry_set_property(global_object,property_name_val,func);
jerry_release_value(property_name_val);
jerry_release_value(result_val);
jerry_release_value(func);
}
  • JS應(yīng)用,rice.js內(nèi)容如下:
varhello=123;

log("youyeetoo:"+hello);
  • 運(yùn)行結(jié)果:

a603e988-cd3b-11ed-a826-dac502259ad0.png

C端如何導(dǎo)出參數(shù)提供給JS端

  • C語言開發(fā)中,我們往往會把一些固定不變的值采用宏去定義一些數(shù)值或者字符串,如:
#defineE_VALUE123
#defineE_STRING"youyeetoo"
  • 對于JS應(yīng)用來說,實(shí)際也是需要一些固定不變的數(shù)值,所以我們可以通過C端導(dǎo)出一些固定數(shù)值到JS端,供JS應(yīng)用使用。
  • 對于JerryScript來說,不管是數(shù)值還是字符串都是導(dǎo)出對應(yīng)特性,實(shí)例分別是導(dǎo)出:數(shù)值E_VALUE特性和字符串E_STRING:
  1. 通過jerry_get_global_object方法獲取全局對象;
  2. 通過jerry_create_number創(chuàng)建數(shù)值特性對象,通過jerry_create_string創(chuàng)建字符串特性對象;
  3. 我們提供給js應(yīng)用調(diào)用的方法,需要導(dǎo)出一個特性名字,通過jerry_create_string_from_utf8方法創(chuàng)建字符串對象(如:E_VALUE和E_STRING);
  4. 通過jerry_set_property方法,導(dǎo)出特性變量。
  5. 導(dǎo)出完特性變量之后,需要將其使用的對象值全部釋放。
staticvoidjs_num_param_init(void)
{
jerry_value_tglobal_object=jerry_get_global_object();

jerry_value_tnum_val=jerry_create_number(123);
jerry_value_tproperty_name_val=jerry_create_string_from_utf8((constjerry_char_t*)"E_VALUE");
jerry_value_tresult_val=jerry_set_property(global_object,property_name_val,num_val);
jerry_release_value(property_name_val);
jerry_release_value(result_val);
jerry_release_value(num_val);
}

staticvoidjs_str_param_init(void)
{
jerry_value_tglobal_object=jerry_get_global_object();

jerry_value_tstr_val=jerry_create_string("good");
jerry_value_tproperty_name_val=jerry_create_string_from_utf8((constjerry_char_t*)"E_STRING");
jerry_value_tresult_val=jerry_set_property(global_object,property_name_val,str_val);
jerry_release_value(property_name_val);
jerry_release_value(result_val);
jerry_release_value(str_val);
}
  • JS應(yīng)用,rice.js內(nèi)容如下:
log("youyeetoo:"+E_VALUE);
log("youyeetoo:"+E_STRING);
  • 運(yùn)行結(jié)果:

a644c638-cd3b-11ed-a826-dac502259ad0.png

通過C端導(dǎo)出LED方法,JS端控制LED燈

  • 我是用的板子有4個LED,分別接在PE3,PD7,PG3,PA5個引腳,我們需要對齊編號,如下:
#defineLED1_PINGET_PIN(E,3)
#defineLED2_PINGET_PIN(D,7)
#defineLED3_PINGET_PIN(G,3)
#defineLED4_PINGET_PIN(A,5)

staticuint16_tled_list[]={LED1_PIN,LED2_PIN,LED3_PIN,LED4_PIN};
  • led方法需要兩個參數(shù),第一個參數(shù)代表LED編號,第二個參數(shù)代表引腳電平,我們的導(dǎo)出接口名為:led,接口定義如下:
staticjerry_value_tled_handler(constjerry_value_tfunction_obj,
constjerry_value_tthis_val,
constjerry_value_targs[],
constjerry_length_targCount)
{
jerry_value_tled=jerry_get_number_value(args[0]);
jerry_value_tlevel=jerry_get_number_value(args[1]);

rt_pin_write(led_list[led],level);

returnjerry_create_undefined();
}

staticvoidjs_led_func_init(void)
{
jerry_value_tglobal_object=jerry_get_global_object();

jerry_value_tfunc=jerry_create_external_function(led_handler);
jerry_value_tproperty_name_val=jerry_create_string_from_utf8((constjerry_char_t*)"led");
jerry_value_tresult_val=jerry_set_property(global_object,property_name_val,func);
jerry_release_value(property_name_val);
jerry_release_value(result_val);
jerry_release_value(func);
}
  • JS應(yīng)用,將板子的四個LED點(diǎn)亮,rice.js內(nèi)容如下:
log("youyeetoo:"+E_VALUE);
log("youyeetoo:"+E_STRING);
led(0,1);
led(1,1);
led(2,1);
led(3,1);
  • 運(yùn)行結(jié)果:
a660769e-cd3b-11ed-a826-dac502259ad0.png

總結(jié)

  • C端導(dǎo)出方法之后,在JS端實(shí)際編寫程序是非常方便的,調(diào)用方式跟C語言編程一樣。
  • 可以通過C導(dǎo)出固定參數(shù),使JS端調(diào)用起來像C端調(diào)用宏定義一樣。
  • 我們可以通過C端導(dǎo)出硬件控制接口,使得JS應(yīng)用程序可以調(diào)用應(yīng)用接口。
  • 當(dāng)C端的基礎(chǔ)能力編寫完畢之后,JS應(yīng)用程序?qū)嶋H跟C語言是基本一致的,而且JavaScript提供了很多方法,對于我們編寫業(yè)務(wù)邏輯更加友好。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5046

    文章

    18817

    瀏覽量

    298548
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2943

    瀏覽量

    104100
  • javascript
    +關(guān)注

    關(guān)注

    0

    文章

    515

    瀏覽量

    53658
收藏 人收藏

    評論

    相關(guān)推薦

    移植nodejs到嵌入式linux的方法

    Node.js是一個基于Chrome V8引擎的JavaScript運(yùn)行環(huán)境.Node.js使用了一個事件驅(qū)動,非阻塞I / O的模型,使其輕量又高效。
    發(fā)表于 11-05 06:05

    嵌入式設(shè)備中使用JavaScript

    只聽說過匯編,c嵌入式,從不曾想JAVAScript也牛到涉入硬件領(lǐng)域了,原本對他的思維定格就是一個瀏覽器腳本??磥碚鎽?yīng)了那句話‘只有想不到,沒有做不到’話不多說看看這些大佬的帖子在嵌入式
    發(fā)表于 11-08 06:14

    javascript嵌入式

    javascript嵌入式If expressions are single units of JavaScript that the engine can evaluate, statements
    發(fā)表于 12-15 07:36

    嵌入式瀏覽器內(nèi)原生javaScript出錯的原因

    嵌入式瀏覽器內(nèi)原生javaScript出錯記錄一次開發(fā)中遇到的一個問題。第一次在智慧大屏類似的設(shè)備上開發(fā),沒留意內(nèi)嵌的瀏覽器的版本。在js
    發(fā)表于 12-21 08:01

    Altera FPGA全國嵌入式創(chuàng)新開發(fā)實(shí)踐

    Altera FPGA全國嵌入式創(chuàng)新開發(fā)實(shí)踐:Altera FPGA全國嵌入式創(chuàng)新開發(fā)實(shí)踐(2008.10.30)
    發(fā)表于 12-27 16:15 ?22次下載

    ARM與C/OS-Ⅱ嵌入式系統(tǒng)設(shè)計(jì)與實(shí)例開發(fā)

    ARM與C/OS-Ⅱ嵌入式系統(tǒng)設(shè)計(jì)與實(shí)例開發(fā)希望大家有所收獲1、掌握一種學(xué)習(xí)方法 2、學(xué)習(xí)了解嵌入式技術(shù)研發(fā)的基本概念、
    發(fā)表于 04-14 14:56 ?34次下載

    嵌入式圖形系統(tǒng)μc/GUI的移植和開發(fā)

    嵌入式圖形系統(tǒng)μc/GUI的移植和開發(fā) 摘要  嵌入式系統(tǒng)的開發(fā)已成為新的行業(yè)熱點(diǎn),而嵌入式
    發(fā)表于 12-25 17:55 ?1109次閱讀
    <b class='flag-5'>嵌入式</b>圖形系統(tǒng)μ<b class='flag-5'>c</b>/GUI的移植和<b class='flag-5'>開發(fā)</b>

    嵌入式開發(fā)通常采用哪種編程語言

    目前在嵌入式開發(fā)領(lǐng)域比較常見的編程語言是C,另外C++、Python、JavaScript等語言也可以進(jìn)行嵌入式開發(fā)??偟膩碚f,這幾門編程語
    發(fā)表于 06-18 16:59 ?1.6w次閱讀

    javascript與flash之間來回傳值

    javascript與flash之間來回傳值(嵌入式開發(fā)未來的生活)-在javascript與flash之間來回傳值一、AS調(diào)用JS
    發(fā)表于 08-04 15:10 ?57次下載
    在<b class='flag-5'>javascript</b>與flash之間來回傳值

    移植nodejs到嵌入式linux,讓終端支持可使用js做些功能

    ? ? ?Node.js是一個基于Chrome V8引擎的JavaScript運(yùn)行環(huán)境.Node.js使用了一個事件驅(qū)動,非阻塞I / O的模型,使其輕量又高效。? ?
    發(fā)表于 11-01 18:00 ?14次下載
    移植nodejs到<b class='flag-5'>嵌入式</b>linux,讓終端支持可使用<b class='flag-5'>js</b>做些功能

    未來之JavaScript嵌入式

    只聽說過匯編,c嵌入式,從不曾想JAVAScript也牛到涉入硬件領(lǐng)域了,原本對他的思維定格就是一個瀏覽器腳本??磥碚鎽?yīng)了那句話‘只有想不到,沒有做不到’話不多說看看這些大佬的帖子在嵌入式
    發(fā)表于 11-03 13:51 ?4次下載
    未來之<b class='flag-5'>JavaScript</b>做<b class='flag-5'>嵌入式</b>

    C嵌入式編程設(shè)計(jì)模式

    C嵌入式編程設(shè)計(jì)模式1 嵌入式系統(tǒng)有何特殊之處 11 嵌入式設(shè)計(jì)的約束 12 嵌入式工具 1
    發(fā)表于 11-03 15:36 ?17次下載
    <b class='flag-5'>C</b><b class='flag-5'>嵌入式</b>編程設(shè)計(jì)<b class='flag-5'>模式</b>

    C嵌入式編程設(shè)計(jì)模式》讀書筆記

    C嵌入式編程設(shè)計(jì)模式》第一章 什么是嵌入式編程嵌入式系統(tǒng)的基本知識面向?qū)ο缶幊膛c結(jié)構(gòu)化編程使用C
    發(fā)表于 11-03 16:06 ?12次下載
    《<b class='flag-5'>C</b><b class='flag-5'>嵌入式</b>編程設(shè)計(jì)<b class='flag-5'>模式</b>》讀書筆記

    用于嵌入式設(shè)備的JavaScript

      這些開發(fā)系統(tǒng)中的每一個都是在嵌入式設(shè)備上開始 JavaScript 開發(fā)的好工具。盡管 JavaScript 在近 20 年前首次引入,
    的頭像 發(fā)表于 06-29 09:39 ?3399次閱讀
    用于<b class='flag-5'>嵌入式</b>設(shè)備的<b class='flag-5'>JavaScript</b>

    嵌入式編程語言的狀態(tài)

    C語言已經(jīng)穩(wěn)定了一代以上的嵌入式系統(tǒng)編程。但今天,一種新型的開發(fā)人員正在世界各地的高中和大學(xué)接受培訓(xùn),他們不使用C語言。他們使用的是蟒蛇、JavaS
    的頭像 發(fā)表于 10-14 15:50 ?730次閱讀
    <b class='flag-5'>嵌入式</b>編程語言的狀態(tài)