2 重新调整FIFO缓冲区(1)(harib10b)
把目光转向HariMain程序,我们能发现还有其他可以简化的内容。
改写前的HariMain节选
if (fifo8_status(&keyfifo) + fifo8_status(&mousefifo) + fifo8_status(&timerfifo)
+ fifo8_status(&timerfifo2) + fifo8_status(&timerfifo3) == 0) {
io_sti();
} else {
这都是什么呀,整这么长一个if语句?使用3个定时器的情况下,就需要3个FIFO缓冲区吗?要是100个定时器难道就需要创建100个FIFO缓冲区吗?嗯……
把定时器用的多个FIFO缓冲区都集中成1个不是更好吗?可能会有人担心:“如果集中成了1个,会不会分辨不出是哪个定时器超时了?”其实只要在超时的情况下,我们往FIFO内写入不同的数据,就可以正常地分辨出是哪个定时器超时了。
本次的HariMain节选
fifo8_init(&timerfifo, 8, timerbuf);
timer = timer_alloc();
timer_init(timer, &timerfifo, 10);
timer_settime(timer, 1000);
timer2 = timer_alloc();
timer_init(timer2, &timerfifo, 3);
timer_settime(timer2, 300);
timer3 = timer_alloc();
timer_init(timer3, &timerfifo, 1);
timer_settime(timer3, 50);
我们对if语句也进行相应的修改吧。
本次的HariMain节选
for (;;) {
sprintf(s, "%010d", timerctl.count);
putfonts8_asc_sht(sht_win, 40, 28, COL8_000000, COL8_C6C6C6, s, 10);
io_cli();
if (fifo8_status(&keyfifo) + fifo8_status(&mousefifo) + fifo8_status(&timerfifo) == 0) {
io_sti();
} else {
if (fifo8_status(&keyfifo) != 0) {
(中略)
} else if (fifo8_status(&mousefifo) != 0) {
(中略)
} else if (fifo8_status(&timerfifo) != 0) {
i = fifo8_get(&timerfifo); /*超时的是哪个呢? */
io_sti();
if (i == 10) {
putfonts8_asc_sht(sht_back, 0, 64, COL8_FFFFFF, COL8_008484, "10[sec]", 7);
} else if (i == 3) {
putfonts8_asc_sht(sht_back, 0, 80, COL8_FFFFFF, COL8_008484, "3[sec]", 6);
} else {
/* 0还是1 */
if (i != 0) {
timer_init(timer3, &timerfifo, 0); /*下面是设定为0 */
boxfill8(buf_back, binfo->scrnx, COL8_FFFFFF, 8, 96, 15, 111);
} else {
timer_init(timer3, &timerfifo, 1); /*下面是设定为1*/
boxfill8(buf_back, binfo->scrnx, COL8_008484, 8, 96, 15, 111);
}
timer_settime(timer3, 50);
sheet_refresh(sht_back, 8, 96, 16, 112);
}
}
}
}
哦,程序略有精简。bootpack.c变成204行,精简了4行。我们“make run”一下,当然是正常运行了。