summaryrefslogtreecommitdiff
path: root/kernel/task.c
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-09-03 14:04:12 +0200
committerMichal Idziorek <m.i@gmx.at>2014-09-03 14:04:12 +0200
commita6efba7a22b85c0556c8c262f3bbcaf7bda7ddfa (patch)
treee060237fe895995ad1fd6eee0f7f3b19beed8088 /kernel/task.c
parent0ce7674a27043cfdf4115d09d65493ac8af13563 (diff)
Moved kernel to 0x10000 !
Diffstat (limited to 'kernel/task.c')
-rw-r--r--kernel/task.c46
1 files changed, 26 insertions, 20 deletions
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;
}