/** * Handles a request for a task. * */ int handle(Task *task, Request *req) { // Handle Interrupts. if (req == 0) { int data; int event = process_interrupt(&data); kevent(event, data); make_ready(task); return 0; } // Handle System Calls. switch (req->request) { case MY_TID: kmytid(task); break; case CREATE: kcreate(task, (int)req->args[0] /* priority */, req->args[1] /* code */, (int)req->args[2] /* args */); break; case MY_PARENT_TID: kmy_parent_tid(task); break; case PASS: make_ready(task); break; case EXIT: kexit(task); break; case SEND: ksend(task, (int)req->args[0], (char *)req->args[1], (int)req->args[2], (char *)req->args[3], (int)req->args[4]); break; case RECEIVE: krecieve(task, (int *)req->args[0], (char *)req->args[1], (int)req->args[2]); break; case REPLY: kreply(task, (int)req->args[0], (char *)req->args[1], (int)req->args[2]); break; case AWAIT_EVENT: kawait(task, (int)req->args[0]); break; case WAIT_TID: kwait_tid(task, (int)req->args[0]); break; case SHUTDOWN: return -1; default: bwprintf(COM2, "Undefined request number %u\n", req->request); break; } return 0; }
/* _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ Funtion :_bk_rsm_tsk Input :struct task *task < task to resume from suspend > Output :void Return :ER < result > Description :resume a task for btron _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ */ EXPORT ER _bk_rsm_tsk(struct task *task) { ER ercd = E_OK; switch ( task->state ) { case TS_NONEXIST: ercd = E_NOEXS; break; case TS_DORMANT: case TS_READY: case TS_WAIT: ercd = E_OBJ; break; case TS_SUSPEND: if ( --task->suscnt == 0 ) { make_ready(task); } break; case TS_WAITSUS: if ( --task->suscnt == 0 ) { task->state = TS_WAIT; } break; default: ercd = E_SYS; break; } return ercd; }
int main() { initialize_kernel(); active = task_create(first, 0, MEDIUM); make_ready(active); unsigned int kernel_cpu_time = 0; Request *req; FineTimer timer; fine_timer_reset(&timer); while((active = schedule())) { kernel_cpu_time += fine_timer_elapsed(&timer); fine_timer_reset(&timer); req = kernel_exit(active); active->cpu_time += fine_timer_elapsed(&timer); fine_timer_reset(&timer); int shutdown = handle(active, req); if (shutdown) break; } // Print out runtime stats dump_timing_info(kernel_cpu_time); log ("Kernel exiting\n"); disable_interrupts(); return 0; }
/* * Resume task */ SYSCALL ER _tk_rsm_tsk( ID tskid ) { TCB *tcb; ER ercd = E_OK; CHECK_TSKID(tskid); CHECK_NONSELF(tskid); tcb = get_tcb(tskid); BEGIN_CRITICAL_SECTION; switch ( tcb->state ) { case TS_NONEXIST: ercd = E_NOEXS; break; case TS_DORMANT: case TS_READY: case TS_WAIT: ercd = E_OBJ; break; case TS_SUSPEND: if ( --tcb->suscnt == 0 ) { make_ready(tcb); } break; case TS_WAITSUS: if ( --tcb->suscnt == 0 ) { tcb->state = TS_WAIT; } break; default: ercd = E_SYS; break; } END_CRITICAL_SECTION; return ercd; }
/* * Start task */ SYSCALL ER _tk_sta_tsk( ID tskid, INT stacd ) { TCB *tcb; TSTAT state; ER ercd = E_OK; CHECK_TSKID(tskid); CHECK_NONSELF(tskid); tcb = get_tcb(tskid); BEGIN_CRITICAL_SECTION; state = (TSTAT)tcb->state; if ( state != TS_DORMANT ) { ercd = ( state == TS_NONEXIST )? E_NOEXS: E_OBJ; } else { setup_stacd(tcb, stacd); make_ready(tcb); } END_CRITICAL_SECTION; return ercd; }