int cpu_state_machine() { int state = 0; while(state != ERROR) { switch(state) { case S0_FIRST_COMS: if ( umc_first_com() == SUCCESS && kernel_first_com() == SUCCESS) { state = S1_GET_PCB; } else { state = ERROR; } break; case S1_GET_PCB: if (get_pcb() == SUCCESS) { state = S2_CHANGE_ACTIVE_PROCESS; } else { state = ERROR; } break; case S2_CHANGE_ACTIVE_PROCESS: if (change_active_process() == SUCCESS) { state = S3_EXECUTE; } else { state = ERROR; } break; case S3_EXECUTE: if (execute_state_machine() == SUCCESS) { state = S4_RETURN_PCB; } else { state = ERROR; } break; case S4_RETURN_PCB: if (return_pcb() == SUCCESS) { if(LAST_QUANTUM_FLAG) { return SUCCESS; } state = S1_GET_PCB; } else { state = ERROR; } break; default: case ERROR: return ERROR; break; } } return SUCCESS; }
void init() { struct pcb* p_kernel_pcb; init_pcbs(); p_kernel_pcb = get_pcb(&p_free_pcb); if (NULL == p_kernel_pcb) return; insert_pcb(&p_used_pcb, p_kernel_pcb); p_kernel_pcb->stack = NULL; p_pcb_now = p_kernel_pcb; }
void create_task(void (*f)(), void* stack_bottom) { unsigned short *sp = stack_bottom; unsigned long *esp; struct pcb *p_pcb = get_pcb(&p_free_pcb); if (NULL == p_pcb) return; insert_pcb(&p_used_pcb, p_pcb); /*prepare stack for task*/ *sp-- = 0x0202;//flags *sp-- = 0;//cs *sp = (unsigned short)f;//ip esp = (unsigned long*)sp; esp --; *esp-- = 0xAAAAAAAA;//eax *esp-- = 0xBBBBBBBB;//ebx *esp-- = 0xCCCCCCCC;//ecx *esp-- = 0xDDDDDDDD;//edx *esp-- = 0xEEEEEEEE;//ebp *esp-- = 0xFFFFFFFF;//esi *esp = 0xABABABAB;//edi p_pcb->stack = esp; }