读书笔记《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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值