/*! initialize */ void mrbc_init(uint8_t *ptr, unsigned int size ) { mrbc_init_alloc(ptr, size); init_static(); hal_init(); // TODO 関数呼び出しが、c_XXX => mrbc_XXX の daisy chain になっている。 // 不要な複雑さかもしれない。要リファクタリング。 mrbc_define_method(0, mrbc_class_object, "sleep", c_sleep); mrbc_define_method(0, mrbc_class_object, "sleep_ms", c_sleep_ms); mrbc_define_method(0, mrbc_class_object, "relinquish", c_relinquish); mrbc_define_method(0, mrbc_class_object, "change_priority", c_change_priority); mrbc_define_method(0, mrbc_class_object, "suspend_task", c_suspend_task); mrbc_define_method(0, mrbc_class_object, "resume_task", c_resume_task); mrbc_define_method(0, mrbc_class_object, "get_tcb", c_get_tcb); mrbc_class *c_mutex; c_mutex = mrbc_define_class(0, "Mutex", mrbc_class_object); mrbc_define_method(0, c_mutex, "new", c_mutex_new); mrbc_define_method(0, c_mutex, "lock", c_mutex_lock); mrbc_define_method(0, c_mutex, "unlock", c_mutex_unlock); mrbc_define_method(0, c_mutex, "try_lock", c_mutex_trylock); mrbc_class *c_vm; c_vm = mrbc_define_class(0, "VM", mrbc_class_object); mrbc_define_method(0, c_vm, "tick", c_vm_tick); }
void mrubyc(uint8_t *mrbbuf) { struct VM *vm; mrbc_init_alloc(memory_pool, MEMORY_SIZE); init_static(); vm = mrbc_vm_open(NULL); if( vm == 0 ) { fprintf(stderr, "Error: Can't open VM.\n"); return; } if( mrbc_load_mrb(vm, mrbbuf) != 0 ) { fprintf(stderr, "Error: Illegal bytecode.\n"); return; } mrbc_vm_begin(vm); mrbc_vm_run(vm); mrbc_vm_end(vm); mrbc_vm_close(vm); }