概述
- 上一篇我們描述了為什么我們要使用膠水語言(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)說明:
-
在使用JerryScript引擎實(shí)現(xiàn)C端與JavaScript端交互時(shí),許喲啊弄清楚幾個(gè)概念:
類型 | 說明 |
---|---|
object | 對(duì)象,JerryScript是基于對(duì)象編程的,所以我們導(dǎo)出的方法都是對(duì)象的基礎(chǔ)上的 |
property | 特性,如導(dǎo)出的參數(shù),函數(shù)等,都屬于特性,歸屬于某個(gè)對(duì)象的特性 |
value | 值,在JerryScript中,所有的對(duì)象,特性,參數(shù),方法,都會(huì)轉(zhuǎn)為一個(gè)32位的數(shù)值,然后我們通過這個(gè)數(shù)值便可以訪問對(duì)應(yīng)內(nèi)容 |
C端如何導(dǎo)出方法提供給到JS端
- 在JavaScript的引擎(JerryScript)中,提供了很多方法供我們實(shí)現(xiàn)C端與JS端的交互,C端導(dǎo)出模塊也是依賴這些方法的。
- 那么如何從C端導(dǎo)出方法呢???為了更好的演示,我們通過從C端導(dǎo)出一個(gè)日志打印方法提供給到JS應(yīng)用使用,并在JS應(yīng)用中驗(yàn)證。
- 導(dǎo)出的方法我們需要遵從模板,其中我們要關(guān)注的參數(shù):
- this_val:自身對(duì)象值。
- args_p[]:JS調(diào)用導(dǎo)出方法接口時(shí)的參數(shù)列表。
- args_count:JS調(diào)用導(dǎo)出方法接口時(shí)的參數(shù)個(gè)數(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):
- 日志打印接口只需要一個(gè)輸入?yún)?shù),并且這個(gè)參數(shù)類型位字符串(string),所以我們只需要處理一個(gè)入?yún)ⅲ?/li>
- 前面我們已經(jīng)描述了:在JerryScript中,所有的對(duì)象,特性,參數(shù),方法,都會(huì)轉(zhuǎn)為一個(gè)32位的數(shù)值,所以我們需要將參數(shù)值解析出來;
- 通過jerry_value_to_string方法將args[0]轉(zhuǎn)為字符串?dāng)?shù)值(str_value);
- 通過jerry_string_to_utf8_char_buffer方法從字符串?dāng)?shù)值(str_value)獲取字符串內(nèi)容;
- 提取完數(shù)據(jù)之后,需要調(diào)用jerry_release_value方法,將字符串?dāng)?shù)值(str_value)資源釋放;
- 將提取的內(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方法;
- 通過jerry_get_global_object方法獲取全局對(duì)象;
- 通過jerry_create_external_function創(chuàng)建外部函數(shù)(log_handle)對(duì)象;
- 我們提供給js應(yīng)用調(diào)用的方法,需要導(dǎo)出一個(gè)方法名(log),通過jerry_create_string_from_utf8方法創(chuàng)建一個(gè)字符串("log")對(duì)象;
- 通過jerry_set_property方法,導(dǎo)出一個(gè)名為log的方法;
- 導(dǎo)出完所有l(wèi)og方法之后,需要將其使用的對(duì)象值全部釋放;
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é)果:
C端如何導(dǎo)出參數(shù)提供給JS端
- 在C語言開發(fā)中,我們往往會(huì)把一些固定不變的值采用宏去定義一些數(shù)值或者字符串,如:
#defineE_VALUE123
#defineE_STRING"youyeetoo"
- 對(duì)于JS應(yīng)用來說,實(shí)際也是需要一些固定不變的數(shù)值,所以我們可以通過C端導(dǎo)出一些固定數(shù)值到JS端,供JS應(yīng)用使用。
- 對(duì)于JerryScript來說,不管是數(shù)值還是字符串都是導(dǎo)出對(duì)應(yīng)特性,實(shí)例分別是導(dǎo)出:數(shù)值E_VALUE特性和字符串E_STRING:
- 通過jerry_get_global_object方法獲取全局對(duì)象;
- 通過jerry_create_number創(chuàng)建數(shù)值特性對(duì)象,通過jerry_create_string創(chuàng)建字符串特性對(duì)象;
- 我們提供給js應(yīng)用調(diào)用的方法,需要導(dǎo)出一個(gè)特性名字,通過jerry_create_string_from_utf8方法創(chuàng)建字符串對(duì)象(如:E_VALUE和E_STRING);
- 通過jerry_set_property方法,導(dǎo)出特性變量。
- 導(dǎo)出完特性變量之后,需要將其使用的對(duì)象值全部釋放。
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é)果:
通過C端導(dǎo)出LED方法,JS端控制LED燈
- 我是用的板子有4個(gè)LED,分別接在PE3,PD7,PG3,PA5個(gè)引腳,我們需要對(duì)齊編號(hào),如下:
#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方法需要兩個(gè)參數(shù),第一個(gè)參數(shù)代表LED編號(hào),第二個(gè)參數(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)用,將板子的四個(gè)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é)果:
總結(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提供了很多方法,對(duì)于我們編寫業(yè)務(wù)邏輯更加友好。
-
嵌入式
+關(guān)注
關(guān)注
5052文章
18909瀏覽量
300739 -
JAVA
+關(guān)注
關(guān)注
19文章
2946瀏覽量
104366 -
javascript
+關(guān)注
關(guān)注
0文章
515瀏覽量
53715
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論