讀書筆記《30天自制操作系統》day07

1. 在中斷處理程序中負責顯示不恰當,應該產生中斷後把中斷數據取出來放到FIFO中去。

2. 當鍵盤產生中斷後後中斷處理程序應該向PIC的OCW2發出0x60+IRQ號碼的out指令,說明在中斷處理程序中已經知道這個事件了,接着發出in指令從0x0060寄存器讀取鍵盤按鍵產生的信息,該鍵盤信息保存到FIFO緩衝區中。

#define PORT_KEYDATA 0x0060
struct 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_OVERRUN		0x0001
void 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;
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章