kernel.c 1.42 KiB
#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;
}