source: asp3_tinet_ecnl_rx/trunk/asp3_dcre/tecsgen/tecs/mruby/nMruby_tMrubyVM.c@ 374

Last change on this file since 374 was 374, checked in by coas-nagasima, 5 years ago

mbed関連を更新
シリアルドライバをmbedのHALを使うよう変更
ファイルディスクリプタの処理を更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 7.5 KB
Line 
1/*
2 * Copyright (C) 2008-2017 by TOPPERS Project
3 *
4 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
5 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
6 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
7 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
8 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
9 * スコード中に含まれていること.
10 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
11 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
12 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
13 * の無保証規定を掲載すること.
14 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
15 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
16 * と.
17 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
18 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
19 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
20 * 報告すること.
21 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
22 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
23 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
24 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
25 * 免責すること.
26 *
27 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
28 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
29 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
30 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
31 * の責任を負わない.
32 *
33 * @(#) $Id$
34 */
35
36/* #[<PREAMBLE>]#
37 * #[<...>]# から #[</...>]# で囲まれたコメントは編集しないでください
38 * tecsmerge によるマージに使用されます
39 *
40 * 属性アクセスマクロ #_CAAM_#
41 * irep uint8_t* ATTR_irep
42 * var_irep mrb_irep* VAR_var_irep
43 * mrb mrb_state* VAR_mrb
44 * rproc struct RProc* VAR_rproc
45 *
46 * 呼び口関数 #_TCPF_#
47 * call port: cInit signature: nMruby_sInitializeBridge context:task optional:true
48 * bool_t is_cInit_joined() check if joined
49 * void cInit_initializeBridge( const mrb_state* mrb );
50 * call port: cMalloc signature: sMalloc context:task
51 * int cMalloc_initializeMemoryPool( );
52 * void* cMalloc_calloc( size_t nelem, size_t elem_size );
53 * void* cMalloc_malloc( size_t size );
54 * void* cMalloc_realloc( const void* ptr, size_t new_size );
55 * void cMalloc_free( const void* ptr );
56 *
57 * #[</PREAMBLE>]# */
58
59/* プロトタイプ宣言や変数の定義をここに書きます #_PAC_# */
60#include "nMruby_tMrubyVM_tecsgen.h"
61#include <string.h>
62
63#include <mruby.h>
64#include <mruby/proc.h>
65#include <mruby/data.h>
66#include <mruby/compile.h>
67#include "t_syslog.h"
68
69MRB_API mrb_state* mrb_open_TECS( CELLCB *p_cellcb);
70
71#ifndef E_OK
72#define E_OK 0 /* success */
73#define E_ID (-18) /* illegal ID */
74#endif
75
76/* 受け口関数 #_TEPF_# */
77/* #[<ENTRY_PORT>]# eMrubyVM
78 * entry port: eMrubyVM
79 * signature: nMruby_sMrubyVM
80 * context: task
81 * #[</ENTRY_PORT>]# */
82
83/* #[<ENTRY_FUNC>]# eMrubyVM_initialize
84 * name: eMrubyVM_initialize
85 * global_name: nMruby_tMrubyVM_eMrubyVM_initialize
86 * oneway: false
87 * #[</ENTRY_FUNC>]# */
88bool_t
89eMrubyVM_initialize(CELLIDX idx)
90{
91 CELLCB *p_cellcb;
92 if (VALID_IDX(idx)) {
93 p_cellcb = GET_CELLCB(idx);
94 }
95 else {
96 /* エラー処理コードをここに記述します */
97 return false;
98 } /* end if VALID_IDX(idx) */
99
100 cMalloc_initializeMemoryPool();
101 /* ここに処理本体を記述します #_TEFB_# */
102 /* new interpreter instance */
103 //VAR_mrb = mrb_open();
104 VAR_mrb = mrb_open_TECS(p_cellcb);
105 if (VAR_mrb == NULL) {
106 syslog(LOG_EMERG, "Invalid mrb_state, exiting test driver");
107// cSerialPort_write("Invalid mrb_state, exiting test driver\n", 39);
108 return false;
109 }
110
111 if(is_cInit_joined()){
112 // TECS Bridge
113 cInit_initializeBridge( VAR_mrb );
114 }
115 VAR_var_irep = mrb_read_irep(VAR_mrb, ATTR_irep);
116 VAR_rproc = mrb_proc_new(VAR_mrb, VAR_var_irep);
117 return true;
118}
119
120/* #[<ENTRY_FUNC>]# eMrubyVM_run
121 * name: eMrubyVM_run
122 * global_name: nMruby_tMrubyVM_eMrubyVM_run
123 * oneway: false
124 * #[</ENTRY_FUNC>]# */
125bool_t
126eMrubyVM_run(CELLIDX idx)
127{
128 CELLCB *p_cellcb;
129 if (VALID_IDX(idx)) {
130 p_cellcb = GET_CELLCB(idx);
131 }
132 else {
133 /* エラー処理コードをここに記述します */
134 } /* end if VALID_IDX(idx) */
135
136 /* ここに処理本体を記述します #_TEFB_# */
137 mrb_run(VAR_mrb, VAR_rproc, mrb_top_self(VAR_mrb));
138 if (VAR_mrb->exc) {
139 mrb_p(VAR_mrb, mrb_obj_value(VAR_mrb->exc));
140 return false;
141 }
142 return true;
143}
144
145/* #[<ENTRY_FUNC>]# eMrubyVM_funcall
146 * name: eMrubyVM_funcall
147 * global_name: nMruby_tMrubyVM_eMrubyVM_funcall
148 * oneway: false
149 * #[</ENTRY_FUNC>]# */
150void
151eMrubyVM_funcall(CELLIDX idx, const char_t* name)
152{
153 CELLCB *p_cellcb;
154 mrb_int argc;
155 if (VALID_IDX(idx)) {
156 p_cellcb = GET_CELLCB(idx);
157 }
158 else {
159 /* エラー処理コードをここに記述します */
160 } /* end if VALID_IDX(idx) */
161
162 /* ここに処理本体を記述します #_TEFB_# */
163 argc = 0;
164 (void)mrb_funcall(VAR_mrb, mrb_top_self(VAR_mrb), name, argc );
165}
166
167/* #[<ENTRY_FUNC>]# eMrubyVM_finalize
168 * name: eMrubyVM_finalize
169 * global_name: nMruby_tMrubyVM_eMrubyVM_finalize
170 * oneway: false
171 * #[</ENTRY_FUNC>]# */
172void
173eMrubyVM_finalize(CELLIDX idx)
174{
175 CELLCB *p_cellcb;
176 if (VALID_IDX(idx)) {
177 p_cellcb = GET_CELLCB(idx);
178 }
179 else {
180 /* エラー処理コードをここに記述します */
181 } /* end if VALID_IDX(idx) */
182
183 /* ここに処理本体を記述します #_TEFB_# */
184 syslog(LOG_EMERG, "end of mruby program");
185 mrb_close(VAR_mrb);
186}
187
188/* #[<POSTAMBLE>]#
189 * これより下に非受け口関数を書きます
190 * #[</POSTAMBLE>]#*/
191
192#include "tlsf.h"
193void*
194mrb_TECS_allocf(mrb_state *mrb, void *p, size_t size, void *ud)
195{
196 CELLCB *p_cellcb= (CELLCB *)ud;
197 if (size == 0) {
198 cMalloc_free(p);
199 //tlsf_free(p);
200 return NULL;
201 }
202 else if (p){
203 //return tlsf_realloc(p,size);
204 return cMalloc_realloc(p, size);
205 }
206 else {
207 //return tlsf_malloc(size);
208 return cMalloc_malloc(size);
209 }
210}
211
212// p_cellcb は VM のもの
213// VM セルタイプに、呼び口 call sMalloc cMalloc; を設ける
214// mrb_TECS_allocf を参照
215MRB_API mrb_state*
216mrb_open_TECS( CELLCB *p_cellcb)
217{
218 return mrb_open_allocf(mrb_TECS_allocf, (void *)p_cellcb);
219};
220
221/*** ダミー関数 ***/
222#ifndef EV3_SOUND
223void _write(){}
224void _close(){}
225void _lseek(){}
226void _read(){}
227//void _fstat(){}
228//void _isatty(){}
229#endif
230
231//void _exit(){}
232//void _getpid(){}
233//void _kill(){}
234void _gettimeofday(){}
235void _fini(){}
236
Note: See TracBrowser for help on using the repository browser.