OSDN Git Service

Add Floppy & DMA Driver (imperfect)
[vaneos/vaneosmain.git] / Kernel / task.c
1 /*
2 *Multi Task management system source
3 *(C) 2014 VOSystems.
4 */
5
6 #include<VaneOS.h>
7 #include<task.h>
8 #include<Message.h>
9 #include<timer.h>
10 #include<memory.h>
11 #include<GDT_IDT.h>
12 #include<tools.h>
13
14 extern memmgr* memman;
15
16 unsigned int esp_addr[TASK_INFO_TOTAL];
17 task_manager taskmgr;
18 task_status taskstate[TASK_INFO_TOTAL];
19
20 void task_a()
21 {
22 //      asm_halt();
23         int a = 0;
24         printf("task a : %d", a );
25         
26         switch_task_2( TASK_INFO_ADDR + sizeof( TaskInfo ), TASK_INFO_ADDR + sizeof( TaskInfo ) * 2 );
27         for( ; ; ){
28                 ++a;
29                 if( a % 10 == 0 ){
30                         switch_task_2( TASK_INFO_ADDR + sizeof( TaskInfo ), TASK_INFO_ADDR + sizeof( TaskInfo ) * 2 );
31                 }
32                 printf("task a : %d", a );
33         }
34 }
35
36 void task_b()
37 {
38         int b = 0;
39         printf("task b : %d", b );
40         //asm_halt();
41         switch_task_2( TASK_INFO_ADDR + sizeof( TaskInfo ) * 2, TASK_INFO_ADDR + sizeof( TaskInfo ) );
42         for( ; ; ){
43                 ++b;
44                 if( b % 10 == 0 ){
45                         switch_task_2( TASK_INFO_ADDR + sizeof( TaskInfo ) * 2, TASK_INFO_ADDR /*+ sizeof( TaskInfo )*/ );
46                 }
47                 printf("task b : %d", b );
48         }
49 }
50
51 void init_task()
52 {
53         unsigned int* cur_task = (unsigned int*)CUR_TASK_NUM_ADDR;
54         TaskInfo* t = (TaskInfo*)TASK_INFO_ADDR;
55         int i = 0;
56         
57         *cur_task = 0;
58         for( i = 0; i < TASK_INFO_TOTAL; ++i ){
59                 zero_memory( t + i, sizeof( TaskInfo ) );
60                 taskmgr.tasks[i]=&taskstate[i];//Tasks None
61                 taskstate[i].status=DISUSE;
62         }
63         /*Kernel Task*/
64         taskstate[0].id=io_load_esp();
65         taskstate[0].status=NORMAL;
66         taskstate[0].run_level=KERNEL;
67         taskstate[0].request=NONERQ;
68         taskstate[0].parent_id=KERNEL;
69         esp_addr[0]=io_load_esp();
70         
71         taskmgr.task_time=0;
72         taskmgr.task_num=1;//1 -> Kernel
73 }
74
75 void k_mktask(void (*f)())
76 {
77         int free=int_linear_search(esp_addr[TASK_INFO_TOTAL],0);
78         if(free== -1)return;//stack address full
79         
80         esp_addr[free]=k_malloc(memman,1);
81         set_task(free,f,esp_addr[free]);
82 }
83
84 void set_task( unsigned int task, void (*f)(), unsigned char* esp)
85 {
86         TaskInfo* t = (TaskInfo*)TASK_INFO_ADDR;
87         if( task > TASK_INFO_TOTAL ){
88                 return;
89         }
90         t += task;
91         zero_memory( t, sizeof( TaskInfo ) );
92         t->cs = 0x18;
93         t->ds = t->fs = t->gs = t->es = 0x10;
94         t->ss = 0x10;
95         t->eip = -0x280000 +   (unsigned int) f;
96         t->esp = (unsigned int) esp;
97         t->eflags = 0x00000202;
98         
99         taskstate[task].id=esp;
100         taskstate[task].status=NORMAL;
101         taskstate[task].run_level=KERNEL;
102         taskstate[task].request=NONERQ;
103         taskstate[task].parent_id=KERNEL;
104         esp_addr[task]=esp;
105 }
106
107 unsigned int get_cur_task_num()
108 {
109         unsigned int* cur_task = (unsigned int*)CUR_TASK_NUM_ADDR;
110         return *cur_task;
111 }