2 重新调整FIFO缓冲区(1)(harib10b)

把目光转向HariMain程序,我们能发现还有其他可以简化的内容。

改写前的HariMain节选

  1. if (fifo8_status(&keyfifo) + fifo8_status(&mousefifo) + fifo8_status(&timerfifo)
  2. + fifo8_status(&timerfifo2) + fifo8_status(&timerfifo3) == 0) {
  3. io_sti();
  4. } else {

这都是什么呀,整这么长一个if语句?使用3个定时器的情况下,就需要3个FIFO缓冲区吗?要是100个定时器难道就需要创建100个FIFO缓冲区吗?嗯……

把定时器用的多个FIFO缓冲区都集中成1个不是更好吗?可能会有人担心:“如果集中成了1个,会不会分辨不出是哪个定时器超时了?”其实只要在超时的情况下,我们往FIFO内写入不同的数据,就可以正常地分辨出是哪个定时器超时了。

本次的HariMain节选

  1. fifo8_init(&timerfifo, 8, timerbuf);
  2. timer = timer_alloc();
  3. timer_init(timer, &timerfifo, 10);
  4. timer_settime(timer, 1000);
  5. timer2 = timer_alloc();
  6. timer_init(timer2, &timerfifo, 3);
  7. timer_settime(timer2, 300);
  8. timer3 = timer_alloc();
  9. timer_init(timer3, &timerfifo, 1);
  10. timer_settime(timer3, 50);

我们对if语句也进行相应的修改吧。

本次的HariMain节选

  1. for (;;) {
  2. sprintf(s, "%010d", timerctl.count);
  3. putfonts8_asc_sht(sht_win, 40, 28, COL8_000000, COL8_C6C6C6, s, 10);
  4. io_cli();
  5. if (fifo8_status(&keyfifo) + fifo8_status(&mousefifo) + fifo8_status(&timerfifo) == 0) {
  6. io_sti();
  7. } else {
  8. if (fifo8_status(&keyfifo) != 0) {
  9. (中略)
  10. } else if (fifo8_status(&mousefifo) != 0) {
  11. (中略)
  12. } else if (fifo8_status(&timerfifo) != 0) {
  13. i = fifo8_get(&timerfifo); /*超时的是哪个呢? */
  14. io_sti();
  15. if (i == 10) {
  16. putfonts8_asc_sht(sht_back, 0, 64, COL8_FFFFFF, COL8_008484, "10[sec]", 7);
  17. } else if (i == 3) {
  18. putfonts8_asc_sht(sht_back, 0, 80, COL8_FFFFFF, COL8_008484, "3[sec]", 6);
  19. } else {
  20. /* 0还是1 */
  21. if (i != 0) {
  22. timer_init(timer3, &timerfifo, 0); /*下面是设定为0 */
  23. boxfill8(buf_back, binfo->scrnx, COL8_FFFFFF, 8, 96, 15, 111);
  24. } else {
  25. timer_init(timer3, &timerfifo, 1); /*下面是设定为1*/
  26. boxfill8(buf_back, binfo->scrnx, COL8_008484, 8, 96, 15, 111);
  27. }
  28. timer_settime(timer3, 50);
  29. sheet_refresh(sht_back, 8, 96, 16, 112);
  30. }
  31. }
  32. }
  33. }

哦,程序略有精简。bootpack.c变成204行,精简了4行。我们“make run”一下,当然是正常运行了。