Skip to content
Snippets Groups Projects
kernel.c 1.42 KiB
Newer Older
#include <kernel.h>
extern int GetAvailability(TD* Task);
void kernelInit(KernelStruct* Colonel) {
  
  int i;
  TD* temp;
  TDPQ* PQ;
  int FreeBitMask = 1<<31;
antnh6@gmail.com's avatar
antnh6@gmail.com committed
    for (i = 0; i < MAX_NUM_TD; i++) {
      temp = &(Colonel->Tasks[i]);
      temp->TaskID = i | FreeBitMask;
      temp->ParentID = 0;
      temp->TaskState = Init;
      temp->TaskPriority = Prio0;
      
      if (i == MAX_NUM_TD-1) temp->NextFree = 0;
      else temp->NextFree = &(Colonel->Tasks[i+1]);
      temp->NextInPQ = 0;
      
      temp->sp = (int *)(USER_STACK_TOP - (STACK_SIZE*i));
      temp->spsr = 0x600000d0;
      temp->RetVal = 0;
      temp->lr = 0;
antnh6@gmail.com's avatar
antnh6@gmail.com committed
    }
    
    for(i = 0; i<MAX_NUM_PRIORITY ;i++){
      PQ = &(Colonel->ArrayPQ[i]);
      PQ->Head = NULL;
      PQ->Tail = NULL;
      PQ->Length = 0;
    }
    Colonel->FirstOfFreeList = &(Colonel->Tasks[0]);
    Colonel->LastOfFreeList = &(Colonel->Tasks[MAX_NUM_TD-1]);
antnh6@gmail.com's avatar
antnh6@gmail.com committed
    Colonel->NumTDsAvail = MAX_NUM_TD;
    Colonel->Active = 0;
void InitSwi(){
  asm volatile("mov r4, #0x28\n\t"
	       "ldr r5, =kerent\n\t"
	       "add r5, r5, #0x218000\n\t"
	       "str r5, [r4]\n\t");
}
void activate(KernelStruct* Colonel, TD* Active) {
antnh6@gmail.com's avatar
antnh6@gmail.com committed
    kerxit(Active);
*/
/*
void kprint(){
  bwprintf(COM2,"asdf");
  }*/
TD* GetFreeTD(KernelStruct* Colonel){
  TD* temp;
  int i = 0;
  for(;i<MAX_NUM_TD;i++){
    temp = (Colonel->Tasks + i);
    if(GetAvailability(temp)){
      return temp;
    }
  }
  return 0;
}