Exemplo n.º 1
0
void handleTimerInterrupt(int segment, int stackPointer){
    struct PCB *pcb ;
    struct PCB *head;
    
    setKernelDataSegment();
    pcb = getFreePCB();
    
    if(pcb->state != DEFUNCT){
        
    }
    pcb->stackPointer = stackPointer;
    pcb->state = READY;
    addToReady(pcb);
    
    head = removeFromReady();
    restoreDataSegment();
    
    setKernelDataSegment();
    if(head == NULL){
        head = idleProc;
    }
    
    head->state = RUNNING;
    restoreDataSegment();

    setKernelDataSegment();
    running = head;
    restoreDataSegment();
    //printString("tic");
    returnFromTimer(head->segment, head->stackPointer);
}
Exemplo n.º 2
0
void handleTimerInterrupt(int segment, int sp){
  int q;
  int nextProcess;

  if(segment == findProcessTableSegment(currentProcess)){
    processTable[currentProcess].stackPointer = sp;
  }

  nextProcess = currentProcess + 1;
  for(q=0; q<NUMBEROFPROCESSENTRIES; q++){
    while(nextProcess >= NUMBEROFPROCESSENTRIES){
      nextProcess -= NUMBEROFPROCESSENTRIES;
    }

    if(processTable[nextProcess].active == 1 && processTable[nextProcess].waitingOn == NOONE){
      break;
    }
    nextProcess++;
  }

  sp = processTable[nextProcess].stackPointer;
  segment = findProcessTableSegment(nextProcess);
  currentProcess = nextProcess;

  returnFromTimer(segment, sp);
}
Exemplo n.º 3
0
void handleTimerInterrupt(int segment, int stackPointer){
	struct PCB *pcb;

	setKernelDataSegment();

	(*running).stackPointer = stackPointer;
	(*running).segment = segment;

	if((*running).state != DEFUNCT && (*running).name != "idle\0"){
		(*running).state = READY;
		addToReady(running);
	}
	
	pcb = removeFromReady();

	if(pcb == NULL){
		running = &idleProc;
	}else{
		(*pcb).state = RUNNING;
		running = pcb;
	}

	returnFromTimer((*running).segment,(*running).stackPointer);
	restoreDataSegment();
}
Exemplo n.º 4
0
void handleTimerInterrupt(int segment, int sp) {
  int curProcUser, curProcSegUser, curProcSpUser, count, wait, parentWait;

  setKernelDataSegment();
  curProcSegUser = segment;
  curProcSpUser = sp;
  curProcUser = div(curProcSegUser, 0x1000) - 2;

  if (curProcUser >= 0) {
    procTable[curProcUser].sp = sp;
  }

  for (count = 0; count <= PROC_ENTRY_NUM; count++) {
    curProcUser = (curProcUser + 1) % PROC_ENTRY_NUM;

    /* TODO: Not very efficient, wait to be changed */
    wait = procTable[curProcUser].waiting;
    if (wait != -1) { /* Current process is waiting for `wait` */
      parentWait = procTable[wait].waiting;
      if (!procTable[wait].active && parentWait == -1) {
        procTable[curProcUser].waiting = -1;
        procTable[curProcUser].active = 1;
      }
    }
    if (procTable[curProcUser].active == 1) {
      currentProcess = curProcUser;
      curProcSegUser = currentProcess * 0x1000 + 0x2000;
      curProcSpUser = procTable[currentProcess].sp;
      break;
    }
  }
  restoreDataSegment();
  returnFromTimer(curProcSegUser, curProcSpUser);
}
Exemplo n.º 5
0
void handleTimerInterrupt(int segment, int sp)
{
	
	int i,process,count=1;
	setKernelDataSegment();
	if(segment==0x1000)
	{	printString("segment=1000");
		currentProcess=-1;
	}
	else
	{
		p[currentProcess].sp=sp;
	}
	process=currentProcess+1;
		
	if (segment == 0x1000)
	{
	 	putInMemory(0xB000, 0x8162, 'K');
	 	putInMemory(0xB000, 0x8163, 0x7);
	}
	else if (segment == 0x2000)
	 {
		putInMemory(0xB000, 0x8164, '0');
		putInMemory(0xB000, 0x8165, 0x7);
	 }
	else if (segment == 0x3000)
	 {
		putInMemory(0xB000, 0x8166, '1');
	 	putInMemory(0xB000, 0x8167, 0x7);
	 }
	else
	 {
		putInMemory(0xB000, 0x8160, 'X');
		putInMemory(0xB000, 0x8161, 0x7); 
       	 }
	
	while(process<8)
	{
		
		if(p[process].active==1)
		{
			printString("process active");
			currentProcess=process;
			segment=process+2;
			segment=segment*0x1000;
			if( p[process].sp == 0xff00 )
				printString("segment=0x2000");
			restoreDataSegment();
			returnFromTimer(segment,p[process].sp);
		}	
		if(count==8)
		{
			printString("breaking");
			break;
		}	
		if(process==7)
		{
			printString("process==7");
			process=0;
		}
		else
		{
			process++;
		}
			count++;
			
	}

//	printString("Tic");
	restoreDataSegment();
        returnFromTimer(segment,sp);
}