30天自制操作系统-第16天-多任务(2)
1.更改多任务设计架构
1)架构原型
task = task_alloc();
task->tss.eip=......;
task->tss.esp = ......;
......
task_run();
2)数据结构
#define MAX_TASKS 1000
#define TASK_GDT0 3
struct TSS32{
int backlink,esp0,ss0,esp1,ss1,esp2,ss2,cr3; //与任务相关,切换时,不会被写入(backlink有时会)
int eip,eflags,eax,ebx,ecx,edx,esp,ebp,esi,edi;//32b寄存器
int es,cs,ss,ds,fs,gs; //16b段寄存器
int lftr,iomap; //与任务相关 ,与任务相关,切换时,不会被写入,但程序员要将ldtr设为0,iomap设为0x40000000
}
.
struct TASK{
int sel; //GDT编号,selector
int flags;
struct TSS32 tss;
struct TASKCTL{
int running; //正在运行的任务数量
int now; //当前正在运行的任务
struct TASK *tasks[MAX_TASKS];
struct TASK task0[MAX_TASKS];
2.任务休眠
1)将任务A从tasks中删掉
2)如果fifo32有数据过来,唤醒任务A,执行task_run
3.增加窗口数量(16_day/harib13c)
4.设定任务优先级
原来固定为0.02秒,现在设定为0.01 到0.1秒范围内