参考书籍《30天自制操作系统》、《自己动手写操作系统》
2016-05-26、2016-07-09
主要是加快中断处理,和加入FIFO缓冲区。
因为之前是将打印字符的代码放在了中断函数中,这会造成一定的效率低下,因为当调用中断函数时便包含了打印字符操作,而这时来了新的中断的话(此时在打印之前的中断的相应字符)就会无法响应。对此,需要做的是,一方面将中断与中断对应要处理的事件分离,另一方面制作缓冲区。
缓冲区一方面是向里面添加,中断(每一次调用中断函数)。另一方面不断的读缓冲区里的中断(这个读操作放在C语言main函数的无限循环里)。
缓冲区要用到的数据结构:
struct FIFO8 {
unsigned char *buf;
int p, q, size, free, flags;
};
缓冲区大小为size
free用于保存缓冲区里没有数据的字节数
缓冲区地址buf
p代表下一个数据写入地址
q代表下一个数据读出地址
之后就是写一些函数封装对缓冲区的操作:
初始化缓冲区:
void fifo8_init(struct FIFO8 *fifo, int size, unsigned char *buf)
{
fifo->size = size;
fifo->buf = buf;
fifo->free = size;
fifo->flags = ;
fifo->p = ;
fifo->q = ;
return;
}
向缓冲区传送数据:
int fifo8_put(struct FIFO8 *fifo, unsigned char data)
{
if (fifo->free == ) {
fifo->flags |= FLAGS_OVERRUN;
return -;
}
fifo->buf[fifo->p] = data;
fifo->p++;
if (fifo->p == fifo->size) {
fifo->p = ;
}
fifo->free--;
return ;
}
从缓冲区取得数据:
int fifo8_put(struct FIFO8 *fifo, unsigned char data)
{
if (fifo->free == ) {
fifo->flags |= FLAGS_OVERRUN;
return -;
}
fifo->buf[fifo->p] = data;
fifo->p++;
if (fifo->p == fifo->size) {
fifo->p = ;
}
fifo->free--;
return ;
}
获得当前缓冲区状况:
int fifo8_status(struct FIFO8 *fifo)
{
return fifo->size - fifo->free;
}
C main函数要对缓冲区数据处理(上述函数封装了一些对缓冲区的操作):
……………………
for (;;) {
io_cli();
if (fifo8_status(&keyfifo) + fifo8_status(&mousefifo) == ) {
io_stihlt();
} else {
if (fifo8_status(&keyfifo) != ) {
i = fifo8_get(&keyfifo);
io_sti();
sprintf(s, "%02X", i);
boxfill8(binfo->vram, binfo->scrnx, COL8_008484, , , , );
putfonts8_asc(binfo->vram, binfo->scrnx, , , COL8_FFFFFF, s);
} else if (fifo8_status(&mousefifo) != ) {
i = fifo8_get(&mousefifo);
io_sti();
sprintf(s, "%02X", i);
boxfill8(binfo->vram, binfo->scrnx, COL8_008484, , , , );
putfonts8_asc(binfo->vram, binfo->scrnx, , , COL8_FFFFFF, s);
}
}
}