读书笔记《30天自制操作系统》day07

来源:互联网 发布:淘宝号查询 编辑:程序博客网 时间:2024/05/17 20:33

1. 在中断处理程序中负责显示不恰当,应该产生中断后把中断数据取出来放到FIFO中去。

2. 当键盘产生中断后后中断处理程序应该向PIC的OCW2发出0x60+IRQ号码的out指令,说明在中断处理程序中已经知道这个事件了,接着发出in指令从0x0060寄存器读取键盘按键产生的信息,该键盘信息保存到FIFO缓冲区中。

#define PORT_KEYDATA 0x0060struct FIFO8 keyfifo;void inthandler21(int* esp){    unsigned char data;    io_out8(PIC0_OCW2,0x61);    data=io_in8(PORT_KEYDATA);    fifo8_put(&keyfifo,data);    return ;}

3. 主程序在没事干的时候,看缓冲区有无数据,有则取出显示,没有则执行HLT指令,循环

/* in MariMain*/char s[40],mcursor[256],keybuf[32];fifo8_init(&keyfifo,32,keybuf);for(;;){    io_cli();    if(fifo8_status(&keyfifo)==0)    {        io_stihlt();    }   else    {        i=fifo8_get(&keyfifo);        io_sti();        /*显示i值*/    }}

4. FIFO缓冲区,能有效处理Ctrl键的问题

struct FIFO8{    unsigned char* buf;    int p,q,size,free,flags;};#define FLAGS_OVERRUN0x0001void fifo8_init(struct FIFO8 *fifo, int size, unsigned char *buf){fifo->size = size;fifo->buf = buf;fifo->free = size; fifo->flags = 0;fifo->p = 0; fifo->q = 0; return;}int fifo8_put(struct FIFO8 *fifo, unsigned char data){if (fifo->free == 0) {fifo->flags |= FLAGS_OVERRUN;return -1;}fifo->buf[fifo->p] = data;fifo->p++;if (fifo->p == fifo->size) {fifo->p = 0;}fifo->free--;return 0;}int fifo8_get(struct FIFO8 *fifo){int data;if (fifo->free == fifo->size) {return -1;}data = fifo->buf[fifo->q];fifo->q++;if (fifo->q == fifo->size) {fifo->q = 0;}fifo->free++;return data;}int fifo8_status(struct FIFO8 *fifo){return fifo->size - fifo->free;}


 

原创粉丝点击