2 计量时间(harib09b)
那我们让它干点什么呢?……有了!我们就让它执行下面这段程序吧。
本次的bootback.h节选
struct TIMERCTL {
unsigned int count;
};
本次的timer.c节选
struct TIMERCTL timerctl;
void init_pit(void)
{
io_out8(PIT_CTRL, 0x34);
io_out8(PIT_CNT0, 0x9c);
io_out8(PIT_CNT0, 0x2e);
timerctl.count = 0; /* 这里! */
return;
}
void inthandler20(int *esp)
{
io_out8(PIC0_OCW2, 0x60); /* 把IRQ-00信号接收完了的信息通知给PIC */
timerctl.count++; /* 这里! */
return;
}
程序所做的处理是:首先定义了struct TIMERCTL结构体。然后,在结构体内定义了一个计数变量。初始化PIT时,将这个计数变量设置为0。每次发生定时器中断时,计数变量就以1递增。也就是说,即使这个计数变量在HariMain中不进行加算, 每1秒钟它也会自动增加100。
■■■■■
为了确认这一点,我们把数值显示出来吧。
本次的bootback.c节选
void HariMain(void)
{
(中略)
for (;;) {
sprintf(s, "%010d", timerctl.count); /* 这里! */
boxfill8(buf_win, 160, COL8_C6C6C6, 40, 28, 119, 43);
putfonts8_asc(buf_win, 160, 40, 28, COL8_000000, s);
sheet_refresh(sht_win, 40, 28, 120, 44);
(中略)
}
}
这样的话,数字应该是以每秒钟100的速度增加。而且不论哪个机种增加速度都是一样的。即使CPU的速度不同,增加速度也应该是一样的。我们先做做看吧。执行“make run”。……哦,正常运行了,还算顺利。
1秒钟增加100
利用这个方法,就能知道从启动开始时间过去了多少秒。如果往方便面里倒入开水的同时,我们启动这个程序,就能测量是否到3分钟(=180秒)了。哦,终于向着有实用价值的操作系统迈出了第一步(笑)。顺便说一下,5分钟相当于300秒,所以泡乌冬面时也可以拿它来计时呢!