4 UI_TaskControl *taskctrl;
\r
6 void Initialise_MultiTask(void)
\r
8 taskctrl = MemoryBlock_Allocate_System(sizeof(UI_TaskControl));
\r
9 MemoryBlock_Write_Description(taskctrl, "SystemTaskCtrl");
\r
13 taskctrl->main = MultiTask_Task_Get("SystemMainTask");
\r
14 taskctrl->main->tss.ldtr = 0;
\r
15 taskctrl->idle->tss.iomap = 0x4000;
\r
16 taskctrl->main->tss.cr3 = (uint)ADR_Paging_Directory;
\r
17 Load_TR(taskctrl->main->selector << 3);
\r
18 taskctrl->now = taskctrl->main;
\r
20 taskctrl->idle = MultiTask_Task_Get("SystemIdleTask");
\r
21 taskctrl->idle->tss.ldtr = 0;
\r
22 taskctrl->idle->tss.iomap = 0x4000;
\r
23 taskctrl->idle->tss.eip = (uint)&MultiTask_IdleTask;
\r
24 taskctrl->idle->tss.eflags = 0x00000202;
\r
25 taskctrl->idle->tss.esp = (uint)MemoryBlock_Allocate_System(64 * 1024) + 64 * 1024;
\r
26 MemoryBlock_Write_Description((void *)(taskctrl->idle->tss.esp - 64 * 1024), "IdleTaskStack");
\r
27 taskctrl->idle->tss.es = 1 * 8;
\r
28 taskctrl->idle->tss.cs = 2 * 8;
\r
29 taskctrl->idle->tss.ss = 1 * 8;
\r
30 taskctrl->idle->tss.ds = 1 * 8;
\r
31 taskctrl->idle->tss.fs = 1 * 8;
\r
32 taskctrl->idle->tss.gs = 1 * 8;
\r
33 taskctrl->idle->tss.cr3 = (uint)ADR_Paging_Directory;
\r
35 MultiTask_Task_Run(taskctrl->idle);
\r
36 MultiTask_Task_Run(taskctrl->main);
\r
38 taskctrl->ts = Timer_Get(0, 0);
\r
39 Timer_Set(taskctrl->ts, 2, once);
\r
40 Timer_TaskSwitch_Set(taskctrl->ts);
\r
41 Timer_Run(taskctrl->ts);
\r
46 UI_Task *MultiTask_Task_Get(const uchar *description)
\r
51 task = MemoryBlock_Allocate_System(sizeof(UI_Task));
\r
52 MemoryBlock_Write_Description(task, "UI_Task");
\r
54 task->tss.backlink = 0;
\r
55 task->tss.reserve00 = 0;
\r
58 task->tss.reserve01 = 0;
\r
61 task->tss.reserve02 = 0;
\r
64 task->tss.reserve03 = 0;
\r
67 task->tss.eflags = 0;
\r
77 task->tss.reserve04 = 0;
\r
79 task->tss.reserve05 = 0;
\r
81 task->tss.reserve06 = 0;
\r
83 task->tss.reserve07 = 0;
\r
85 task->tss.reserve08 = 0;
\r
87 task->tss.reserve09 = 0;
\r
89 task->tss.reserve10 = 0;
\r
90 task->tss.flags = 0;
\r
91 task->tss.iomap = 0;
\r
93 task->selector = System_SegmentDescriptor_Set(sizeof(IO_TaskStatusSegment) - 1, (int)&task->tss, AR_TSS32);
\r
95 task->quantum = 2; /*0.02sec Default*/
\r
99 task->state = initialized;
\r
103 for(i = 0; i < (TASK_DESCRIPTION_LENGTH - 1); i++){
\r
104 if(description[i] == 0x00){
\r
107 task->description[i] = description[i];
\r
109 task->description[i] = 0x00;
\r
113 void MultiTask_Task_Change_Quantum(UI_Task *task, uint quantum)
\r
115 if(1 <= quantum && quantum <= 25){ /*0.01-0.25sec*/
\r
116 task->quantum = quantum;
\r
121 void MultiTask_Task_Run(UI_Task *task)
\r
125 if(!(1 <= task->quantum && task->quantum <= 25)){
\r
128 if(task->state == inuse){
\r
130 } else if(task->state == configured){
\r
131 task->state = inuse;
\r
134 eflags = IO_Load_EFlags();
\r
137 task->next = taskctrl->next;
\r
138 taskctrl->next = task;
\r
139 task->state = inuse;
\r
141 IO_Store_EFlags(eflags);
\r
145 void MultiTask_Task_Sleep(UI_Task *task)
\r
149 eflags = IO_Load_EFlags();
\r
152 task->state = configured;
\r
153 if(taskctrl->now == task){
\r
154 Timer_Cancel(taskctrl->ts);
\r
155 MultiTask_TaskSwitch();
\r
158 IO_Store_EFlags(eflags);
\r
163 void MultiTask_Task_Remove(UI_Task *task)
\r
165 UI_Task **next, *newnow;
\r
171 eflags = IO_Load_EFlags();
\r
174 if(taskctrl->now == task){
\r
178 for(newnow = taskctrl->next; newnow->next != 0; newnow = newnow->next){
\r
182 for(next = &taskctrl->next; (*next)->next != 0; next = &(*next)->next){
\r
183 if((*next) == task){
\r
184 (*next) = task->next;
\r
186 task->state = initialized;
\r
192 taskctrl->now = newnow;
\r
193 MultiTask_TaskSwitch();
\r
195 IO_Store_EFlags(eflags);
\r
199 void MultiTask_Task_Arguments(UI_Task *task, int args, ...)
\r
204 va_start(ap, args);
\r
206 task->tss.esp -= 4 * (args + 1);
\r
208 for(i = 1; i < args + 1; i++){
\r
209 *((int *)(task->tss.esp + (i * 4))) = va_arg(ap, int);
\r
215 void MultiTask_TaskSwitch(void)
\r
217 UI_Task *old, *new;
\r
220 eflags = IO_Load_EFlags();
\r
223 old = taskctrl->now;
\r
225 for(new = taskctrl->now->next; ; new = new->next){
\r
227 new = taskctrl->next;
\r
229 if(new->state == inuse){ /*configured = sleep*/
\r
230 taskctrl->now = new;
\r
234 if(old == taskctrl->now){
\r
235 taskctrl->now = old;
\r
238 Timer_Set(taskctrl->ts, taskctrl->now->quantum, once);
\r
239 Timer_Run(taskctrl->ts);
\r
240 taskctrl->now->cputime += taskctrl->now->quantum;
\r
242 FarJMP(0, taskctrl->now->selector << 3);
\r
244 IO_Store_EFlags(eflags);
\r
248 UI_Task *MultiTask_Get_NowTask(void)
\r
250 return taskctrl->now;
\r
253 void MultiTask_IdleTask(void)
\r