2 *Multi Task management system source
14 extern memmgr* memman;
16 unsigned int esp_addr[TASK_INFO_TOTAL];
18 task_status taskstate[TASK_INFO_TOTAL];
24 printf("task a : %d", a );
26 switch_task_2( TASK_INFO_ADDR + sizeof( TaskInfo ), TASK_INFO_ADDR + sizeof( TaskInfo ) * 2 );
30 switch_task_2( TASK_INFO_ADDR + sizeof( TaskInfo ), TASK_INFO_ADDR + sizeof( TaskInfo ) * 2 );
32 printf("task a : %d", a );
39 printf("task b : %d", b );
41 switch_task_2( TASK_INFO_ADDR + sizeof( TaskInfo ) * 2, TASK_INFO_ADDR + sizeof( TaskInfo ) );
45 switch_task_2( TASK_INFO_ADDR + sizeof( TaskInfo ) * 2, TASK_INFO_ADDR /*+ sizeof( TaskInfo )*/ );
47 printf("task b : %d", b );
53 unsigned int* cur_task = (unsigned int*)CUR_TASK_NUM_ADDR;
54 TaskInfo* t = (TaskInfo*)TASK_INFO_ADDR;
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;
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();
72 taskmgr.task_num=1;//1 -> Kernel
75 void k_mktask(void (*f)())
77 int free=int_linear_search(esp_addr[TASK_INFO_TOTAL],0);
78 if(free== -1)return;//stack address full
80 esp_addr[free]=k_malloc(memman,1);
81 set_task(free,f,esp_addr[free]);
84 void set_task( unsigned int task, void (*f)(), unsigned char* esp)
86 TaskInfo* t = (TaskInfo*)TASK_INFO_ADDR;
87 if( task > TASK_INFO_TOTAL ){
91 zero_memory( t, sizeof( TaskInfo ) );
93 t->ds = t->fs = t->gs = t->es = 0x10;
95 t->eip = -0x280000 + (unsigned int) f;
96 t->esp = (unsigned int) esp;
97 t->eflags = 0x00000202;
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;
107 unsigned int get_cur_task_num()
109 unsigned int* cur_task = (unsigned int*)CUR_TASK_NUM_ADDR;