概述
上一篇我們描述了為什么我們要使用膠水語言(JavaScript,PikaScript)來改變我們的嵌入式開發模式。并描述了如何在嵌入式設備拉起JavaScript應用及JavaScript應用在嵌入式設備的存在形式(字符串,文件)。
打破單片機開發模式--膠水語言(JavaScript)
膠水語言可以讓我們職責更加明確,可以類前后端開發模式,后端負責--硬件的適配,方法的導出;前端負責--業務邏輯的的開發。
本篇文章作者來介紹JS在嵌入式設備上的如何使用,我們通過一下幾點說明:
C端如何導出方法提供給到JS端;
C端如何導出參數提供給JS端;
通過C端導出方法,JS端控制LED燈;
在使用JerryScript引擎實現C端與JavaScript端交互時,許喲啊弄清楚幾個概念:
類型 | 說明 |
---|---|
object | 對象,JerryScript是基于對象編程的,所以我們導出的方法都是對象的基礎上的 |
property | 特性,如導出的參數,函數等,都屬于特性,歸屬于某個對象的特性 |
value | 值,在JerryScript中,所有的對象,特性,參數,方法,都會轉為一個32位的數值,然后我們通過這個數值便可以訪問對應內容 |
C端如何導出方法提供給到JS端
在JavaScript的引擎(JerryScript)中,提供了很多方法供我們實現C端與JS端的交互,C端導出模塊也是依賴這些方法的。
那么如何從C端導出方法呢???為了更好的演示,我們通過從C端導出一個日志打印方法提供給到JS應用使用,并在JS應用中驗證。
導出的方法我們需要遵從模板,其中我們要關注的參數:
this_val:自身對象值。
args_p[]:JS調用導出方法接口時的參數列表。
args_count:JS調用導出方法接口時的參數個數。
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):
日志打印接口只需要一個輸入參數,并且這個參數類型位字符串(string),所以我們只需要處理一個入參;
前面我們已經描述了:在JerryScript中,所有的對象,特性,參數,方法,都會轉為一個32位的數值,所以我們需要將參數值解析出來;
通過jerry_value_to_string方法將args[0]轉為字符串數值(str_value);
通過jerry_string_to_utf8_char_buffer方法從字符串數值(str_value)獲取字符串內容;
提取完數據之后,需要調用jerry_release_value方法,將字符串數值(str_value)資源釋放;
將提取的內容打印出來;
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("%s ",(constchar*)log_buff); returnjerry_create_undefined(); }
導出log_handle方法;
通過jerry_get_global_object方法獲取全局對象;
通過jerry_create_external_function創建外部函數(log_handle)對象;
我們提供給js應用調用的方法,需要導出一個方法名(log),通過jerry_create_string_from_utf8方法創建一個字符串("log")對象;
通過jerry_set_property方法,導出一個名為log的方法;
導出完所有log方法之后,需要將其使用的對象值全部釋放;
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應用,rice.js內容如下:
varhello=123; log("youyeetoo:"+hello);
運行結果:
C端如何導出參數提供給JS端
在C語言開發中,我們往往會把一些固定不變的值采用宏去定義一些數值或者字符串,如:
#defineE_VALUE123 #defineE_STRING"youyeetoo"
對于JS應用來說,實際也是需要一些固定不變的數值,所以我們可以通過C端導出一些固定數值到JS端,供JS應用使用。
對于JerryScript來說,不管是數值還是字符串都是導出對應特性,實例分別是導出:數值E_VALUE特性和字符串E_STRING:
通過jerry_get_global_object方法獲取全局對象;
通過jerry_create_number創建數值特性對象,通過jerry_create_string創建字符串特性對象;
我們提供給js應用調用的方法,需要導出一個特性名字,通過jerry_create_string_from_utf8方法創建字符串對象(如:E_VALUE和E_STRING);
通過jerry_set_property方法,導出特性變量。
導出完特性變量之后,需要將其使用的對象值全部釋放。
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應用,rice.js內容如下:
log("youyeetoo:"+E_VALUE); log("youyeetoo:"+E_STRING);
運行結果:
通過C端導出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方法需要兩個參數,第一個參數代表LED編號,第二個參數代表引腳電平,我們的導出接口名為: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應用,將板子的四個LED點亮,rice.js內容如下:
log("youyeetoo:"+E_VALUE); log("youyeetoo:"+E_STRING); led(0,1); led(1,1); led(2,1); led(3,1);
運行結果:
總結
C端導出方法之后,在JS端實際編寫程序是非常方便的,調用方式跟C語言編程一樣。
可以通過C導出固定參數,使JS端調用起來像C端調用宏定義一樣。
我們可以通過C端導出硬件控制接口,使得JS應用程序可以調用應用接口。
當C端的基礎能力編寫完畢之后,JS應用程序實際跟C語言是基本一致的,而且JavaScript提供了很多方法,對于我們編寫業務邏輯更加友好。
審核編輯:劉清
-
嵌入式
+關注
關注
5142文章
19553瀏覽量
315326 -
led燈
+關注
關注
22文章
1595瀏覽量
109386 -
C語言
+關注
關注
180文章
7630瀏覽量
140518 -
javascript
+關注
關注
0文章
525瀏覽量
54530
原文標題:嵌入式新開發模式(JavaScript)--C端與JS端方法調用
文章出處:【微信號:風火輪技術團隊,微信公眾號:風火輪技術團隊】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
如何在嵌入式系統設計中使用UML技術

嵌入式新開發模式(JavaScript)--C端與JS端方法調用
嵌入式Linux下USB藍牙設備驅動
WIFI網卡如何在嵌入式Linux中
嵌入式Linux設備如何在運作
在嵌入式設備中使用JavaScript
javascript嵌入式
如何在嵌入式Linux中使用GPIO
Facebook神經網絡新研究將造福嵌入式設備

未來之JavaScript做嵌入式

評論