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; }
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(); } }
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); }