/*! specify running VM code. @param vm_code pointer of VM byte code. @param tcb Task control block with parameter, or NULL. @retval Pointer of mrbc_tcb. @retval NULL is error. */ mrbc_tcb* mrbc_create_task(const uint8_t *vm_code, mrbc_tcb *tcb) { // allocate Task Control Block if( tcb == NULL ) { tcb = (mrbc_tcb*)mrbc_raw_alloc( sizeof(mrbc_tcb) ); if( tcb == NULL ) return NULL; // ENOMEM mrbc_init_tcb( tcb ); } tcb->timeslice = TIMESLICE_TICK; tcb->priority_preemption = tcb->priority; // assign VM ID if( mrbc_vm_open( &tcb->vm ) == NULL ) { console_printf("Error: Can't assign VM-ID.\n"); return NULL; } if( mrbc_load_mrb(&tcb->vm, vm_code) != 0 ) { console_printf("Error: Illegal bytecode.\n"); mrbc_vm_close( &tcb->vm ); return NULL; } if( tcb->state != TASKSTATE_DORMANT ) { mrbc_vm_begin( &tcb->vm ); } hal_disable_irq(); q_insert_task(tcb); hal_enable_irq(); return tcb; }
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); }