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秒范围内