Example #1
0
/*! 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;
}
Example #2
0
File: main.c Project: mrubyc/mrubyc
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);
}