2 计量时间(harib09b)

那我们让它干点什么呢?……有了!我们就让它执行下面这段程序吧。

本次的bootback.h节选

  1. struct TIMERCTL {
  2. unsigned int count;
  3. };

本次的timer.c节选

  1. struct TIMERCTL timerctl;
  2. void init_pit(void)
  3. {
  4. io_out8(PIT_CTRL, 0x34);
  5. io_out8(PIT_CNT0, 0x9c);
  6. io_out8(PIT_CNT0, 0x2e);
  7. timerctl.count = 0; /* 这里! */
  8. return;
  9. }
  10. void inthandler20(int *esp)
  11. {
  12. io_out8(PIC0_OCW2, 0x60); /* 把IRQ-00信号接收完了的信息通知给PIC */
  13. timerctl.count++; /* 这里! */
  14. return;
  15. }

程序所做的处理是:首先定义了struct TIMERCTL结构体。然后,在结构体内定义了一个计数变量。初始化PIT时,将这个计数变量设置为0。每次发生定时器中断时,计数变量就以1递增。也就是说,即使这个计数变量在HariMain中不进行加算, 每1秒钟它也会自动增加100。

■■■■■

为了确认这一点,我们把数值显示出来吧。

本次的bootback.c节选

  1. void HariMain(void)
  2. {
  3. (中略)
  4. for (;;) {
  5. sprintf(s, "%010d", timerctl.count); /* 这里! */
  6. boxfill8(buf_win, 160, COL8_C6C6C6, 40, 28, 119, 43);
  7. putfonts8_asc(buf_win, 160, 40, 28, COL8_000000, s);
  8. sheet_refresh(sht_win, 40, 28, 120, 44);
  9. (中略)
  10. }
  11. }

这样的话,数字应该是以每秒钟100的速度增加。而且不论哪个机种增加速度都是一样的。即使CPU的速度不同,增加速度也应该是一样的。我们先做做看吧。执行“make run”。……哦,正常运行了,还算顺利。

2 计量时间(harib09b) - 图1

1秒钟增加100

利用这个方法,就能知道从启动开始时间过去了多少秒。如果往方便面里倒入开水的同时,我们启动这个程序,就能测量是否到3分钟(=180秒)了。哦,终于向着有实用价值的操作系统迈出了第一步(笑)。顺便说一下,5分钟相当于300秒,所以泡乌冬面时也可以拿它来计时呢!