From a6efba7a22b85c0556c8c262f3bbcaf7bda7ddfa Mon Sep 17 00:00:00 2001 From: Michal Idziorek Date: Wed, 3 Sep 2014 14:04:12 +0200 Subject: Moved kernel to 0x10000 ! --- kernel/task.c | 46 ++++++++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 20 deletions(-) (limited to 'kernel/task.c') diff --git a/kernel/task.c b/kernel/task.c index b94d5e4..ebfd4a7 100644 --- a/kernel/task.c +++ b/kernel/task.c @@ -15,7 +15,7 @@ void task_test1() while(1) { c++; - while(1)PutString("task0: %d", 00,500,0b1111100000000000, (c++)); + while(1)PutString("t1: %d", 00,500,0b1111100000000000, (c++)); } } @@ -27,7 +27,20 @@ void task_test2() while(1) { c++; - while(1)PutString("task1: %d", 200,500,0b1111100000000000, (c++)); + while(1)PutString("t2: %d", 100,500,0b1111100000000000, (c++)); + + } + +} + +void task_test3() +{ + uint32_t c; + + while(1) + { + c++; + while(1)PutString("t3: %d",200,500,0b1111100000000000, (c++)); } @@ -41,8 +54,8 @@ typedef struct{ //Simple structure for a thread } Thread; -Thread Threads[2]; //Space for our simple threads. Just 2! -int CurrentTask = -1; //The thread currenlty running (-1 == none) +Thread Threads[3]; //Space for our simple threads. Just 2! +volatile int CurrentTask; //The thread currenlty running (-1 == none) void task_create(int pid,void(*thread)()) @@ -50,7 +63,7 @@ void task_create(int pid,void(*thread)()) unsigned int *stack; Threads[pid].esp0 = pmmngr_alloc_block(); - stack = (unsigned int*)Threads[pid].esp0+4000; //This makes a pointer to the stack for us + stack = (unsigned int*)Threads[pid].esp0+4095; //This makes a pointer to the stack for us log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"new task : stack: 0x%08X ", stack); //First, this stuff is pushed by the processor @@ -86,24 +99,15 @@ void task_create(int pid,void(*thread)()) uint32_t task_switch_next(uint32_t oldesp) { - if(started!=0xabcde) return oldesp; + if(CurrentTask!=-1)Threads[CurrentTask].esp0=oldesp; + CurrentTask++; + if(CurrentTask>2)CurrentTask=0; - if(CurrentTask != -1){ //Were we even running a task? - Threads[CurrentTask].esp0 =oldesp; //Save the new esp for the thread - - //Now switch what task we're on - if(CurrentTask == 0)CurrentTask = 1; - else CurrentTask = 0; - } else{ - CurrentTask = 0; //We just started multi-tasking, start with task 0 - } - - uint32_t esp=0; - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"oldesp: 0x%08X saved / next task: %d (esp: 0x%08X) ",oldesp, CurrentTask,Threads[CurrentTask].esp0); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"oldesp: 0x%08X saved / next task: %d (esp: 0x%08X) ",oldesp, CurrentTask,Threads[CurrentTask].esp0); - return Threads[CurrentTask].esp0; //Return new stack pointer to ASM + return Threads[CurrentTask].esp0; //Return new stack pointer to ASM } void stack_trace(uint32_t *stack,int size) @@ -122,7 +126,9 @@ void task_init() log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"init multitasking."); task_create(0,task_test1); task_create(1,task_test2); - started=0xabcde; + task_create(2,task_test3); + started=0xabcde; + CurrentTask=-1; } -- cgit v1.2.3