-
-
- int CreateTask(int id, TaskCallback task)
- {
- struct Registers* r;
- if (taskIndex >= TASK_COUNT || taskIndex < 0)
- return 0;
-
- disable();
- tasks[taskIndex].ID = id;
- tasks[taskIndex].stack = malloc(TASK_STACK_SIZE);
- r = (struct Registers*) (tasks[taskIndex].stack + TASK_STACK_SIZE - sizeof(struct Registers));
-
- tasks[taskIndex].sp = FP_OFF((struct Registers far *) r);
- tasks[taskIndex].ss = FP_SEG((struct Registers far *) r);
- r->cs = FP_SEG(task);
- r->ip = FP_OFF(task);
- r->ds =_DS;
- r->es =_ES;
- r->flags = INTERRUPT_ENABLE;
- tasks[taskIndex].state = READY;
- taskIndex++;
- enable();
- return 1;
- }
这个函数分配一段内存作为当前任务的stack, 由于8086 stack 自顶向下,所以任务寄存器环境指针 r 指向顶部。要被执行的任务地址task 放入 CS:IP 中,以后会由 iret 指令(中断返回) 弹出,去运行 task。