#include <kernel.h> extern int GetAvailability(TD* Task); void kernelInit(KernelStruct* Colonel) { int i; TD* temp; TDPQ* PQ; int FreeBitMask = 1<<31; 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; } 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]); 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) { 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; }