예제 #1
0
TASK_DLLEXPORT Task *
Task_new(const char *name, long stacksize, void *data, void *(*run) (void *data), void (*destroy) (void *data))
{
   Task *task = NEW(Task);

   int psize;

   Task_init();

   ++seqNo;
   task->id = seqNo;
   task->name = strdup(name);
   task->data = data;
   task->run = run;
   task->destroy = destroy;

   if (stacksize < TASK_STACK_MIN)
      stacksize = TASK_STACK_MIN;

   psize = getpagesize();
   if (stacksize >= psize)
   {
      int n = stacksize / psize;

      int rest = stacksize % psize;

      stacksize = n * psize + (rest ? psize : 0);
   }

   task->stacklen = stacksize;
   task->state = Task_initial;

   return task;
}
예제 #2
0
void native_thread_invoke(u08_t mref) {	
	heap_id_t method_h,thread_h;
	u16_t method_id,thread_id;		
	if(mref == NATIVE_METHOD_THREAD_RUNNABLE)
	{
//		nvm_method_hdr_t mhdr, *mhdr_ptr;
		method_h = stack_pop();
		thread_h = stack_pop();
		
		method_id = ((nvm_ref_t*)heap_get_addr(method_h))[0];
		thread_id = ((nvm_ref_t*)heap_get_addr(thread_h))[0];
		Task_init(&SubThread[thread_id],vm_run, (void*)(method_id&0xFF), CONFIG_MAX_PRIORITY - 1, SubThread_stack[thread_id], sizeof(SubThread_stack[thread_id]));
				
//		mhdr_ptr = nvmfile_get_method_hdr(method_id&0xFF);	
		// load new method header into ram
//		nvmfile_read(&mhdr, mhdr_ptr, sizeof(nvm_method_hdr_t));
//		heap_steal(sizeof(nvm_stack_t) * (mhdr.max_locals + mhdr.max_stack + mhdr.args));
//		Task_setjsp(mhdr.
		//stack_push(NVM_TYPE_HEAP | thread_h);
	}
	else if(mref == NATIVE_METHOD_THREAD_START) {
		thread_h = stack_pop();		
		thread_id = ((nvm_ref_t*)heap_get_addr(thread_h))[0];
		SubThread[thread_id].j_sp = (unsigned int*)&heap[heap_base];
		SubThread[thread_id].j_stack = (unsigned int*)&heap[heap_base];
		Task_start(&SubThread[thread_id]);
		//Task_yield();
	}
}
예제 #3
0
static SmartPtr<TaskBasic> Physics_schedule_cb(Physics& ph, py::object cb, py::object period, py::object time)
{
  SmartPtr<TaskBasic> cpp_task = Task_init(cb, period);
  return Physics_schedule_task(ph, cpp_task, time);
}