Exemple #1
0
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;
}
Exemple #2
0
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;
}
Exemple #3
0
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;	
	
}