diff --git a/13_day/bootpack.h b/13_day/bootpack.h index dc74f6f..2db4a08 100644 --- a/13_day/bootpack.h +++ b/13_day/bootpack.h @@ -175,7 +175,7 @@ struct TIMER { int data; }; struct TIMERCTL { - unsigned int count, next, using; + unsigned int count, next; struct TIMER *t0; struct TIMER timers0[MAX_TIMER]; }; diff --git a/13_day/timer.c b/13_day/timer.c index 11ed780..1f61776 100644 --- a/13_day/timer.c +++ b/13_day/timer.c @@ -13,15 +13,20 @@ struct TIMERCTL timerctl; void init_pit(void) { int i; + struct TIMER *t; io_out8(PIT_CTRL, 0x34); io_out8(PIT_CNT0, 0x9c); io_out8(PIT_CNT0, 0x2e); timerctl.count = 0; - timerctl.next = 0xffffffff; /* 因为最初没有正在运行的定时器 */ - timerctl.using = 0; for (i = 0; i < MAX_TIMER; i++) { - timerctl.timers0[i].flags = 0; /* 未使用 */ + timerctl.timers0[i].flags = 0; /* 没有使用 */ } + t = timer_alloc(); /* 取得一个 */ + t->timeout = 0xffffffff; + t->flags = TIMER_FLAGS_USING; + t->next = 0; /* 末尾 */ + timerctl.t0 = t; /* 因为现在只有哨兵,所以他就在最前面*/ + timerctl.next = 0xffffffff; /* 因为只有哨兵,所以下一个超时时刻就是哨兵的时刻 */ return; } @@ -58,75 +63,48 @@ void timer_settime(struct TIMER *timer, unsigned int timeout) timer->flags = TIMER_FLAGS_USING; e = io_load_eflags(); io_cli(); - timerctl.using++; - if (timerctl.using == 1) { - /* 处于运行状态的定时器只有这一个时 */ - timerctl.t0 = timer; - timer->next = 0; /* 没有下一个 */ - timerctl.next = timer->timeout; - io_store_eflags(e); - return; - } t = timerctl.t0; if (timer->timeout <= t->timeout) { - /* 插入最前面的情况下 */ + /* 插入最前面的情况 */ timerctl.t0 = timer; - timer->next = t; /* 下面是t */ + timer->next = t; /* 下面是设定t */ timerctl.next = timer->timeout; io_store_eflags(e); return; } - /* 搜寻插入位置 */ for (;;) { s = t; t = t->next; - if (t == 0) { - break; /* 最后面*/ - } if (timer->timeout <= t->timeout) { - /* 插入到s和t之间时 */ - s->next = timer; /* s的下一个是timer */ + /* 插入s和t之间的情况 */ + s->next = timer; /* s下一个是timer */ timer->next = t; /* timer的下一个是t */ io_store_eflags(e); return; } } - /* 插入最后面的情况下 */ - s->next = timer; - timer->next = 0; - io_store_eflags(e); - return; } void inthandler20(int *esp) { - int i; struct TIMER *timer; - io_out8(PIC0_OCW2, 0x60); /* 把IRQ-00信号接收完了的信息通知给PIC */ + io_out8(PIC0_OCW2, 0x60); /* 把IRQ-00接收信号结束的信息通知给PIC */ timerctl.count++; if (timerctl.next > timerctl.count) { - return; /* 还不到下一个时刻,所以结束*/ + return; } timer = timerctl.t0; /* 首先把最前面的地址赋给timer */ - for (i = 0; i < timerctl.using; i++) { - /* 因为timers的定时器都处于运行状态,所以不确认flags */ + for (;;) { + /* 因为timers的定时器都处于运行状态,所以不确认flags */ if (timer->timeout > timerctl.count) { break; } - /* 超时*/ + /* 超时 */ timer->flags = TIMER_FLAGS_ALLOC; fifo32_put(timer->fifo, timer->data); - timer = timer->next; /* 下一定时器的地址赋给timer */ + timer = timer->next; /* 将下一个定时器的地址赋给timer*/ } - /* 正好有i个定时器超时了。其余的进行移位。 */ - timerctl.using -= i; - /* 新移位 */ timerctl.t0 = timer; - /* timerctl.next的设定 */ - if (timerctl.using > 0) { - timerctl.next = timerctl.t0->timeout; - } else { - timerctl.next = 0xffffffff; - } + timerctl.next = timer->timeout; return; -} +} \ No newline at end of file