24.键盘输入缓冲

本文档介绍了如何实现一个键盘输入的环形缓冲区,以改善键盘驱动程序的功能。通过设置互斥锁确保同一时刻仅允许一个生产者或消费者使用缓冲区,并在缓冲区满或空时限制生产者和消费者的操作。详细阐述了ioqueue.h和ioqueue.c的实现,并将其集成到keyboard.c中,使得缓冲区能够存储63个按键输入,超过容量则不再接收和显示。
摘要由CSDN通过智能技术生成

上一节实现了键盘驱动程序,每按一个键,都打印出来。

本节实现一个环形缓冲区,来作为键盘输入的缓冲。

缓冲区要有的功能:

  • 同一时刻只能被一个生产者或消费者使用(互斥);–锁来实现
  • 缓冲区满时,生产者不能往缓冲区添加数据;
  • 缓冲区空时,消费者不能从缓冲区取数据。

ioqueue.h

#ifndef __DEVICE_IOQUEUE_H
#define __DEVICE_IOQUEUE_H
#include "../lib/std_int.h"
#include "../thread/thread.h"
#include "../thread/sync.h"

#define NULL ((void*)0)
#define bool int
#define bufsize 64

/* 环形队列 */
struct ioqueue {
   
// 生产者消费者问题
    struct lock lock;
 /* 生产者,缓冲区不满时就继续往里面放数据,
  * 否则就睡眠,此项记录哪个生产者在此缓冲区上睡眠。*/
    struct task_struct* producer;

 /* 消费者,缓冲区不空时就继续从往里面拿数据,
  * 否则就睡眠,此项记录哪个消费者在此缓冲区上睡眠。*/
    struct task_struct* consumer;
    char buf[bufsize];			    // 缓冲区大小
    int32_t head;			    // 队首,数据往队首处写入
    int32_t tail;			    // 队尾,数据从队尾处读出
};

void ioqueue_init(struct ioqueue* ioq);
bool ioq_full(struct ioqueue* ioq);
char ioq_getchar(struct ioqueue* ioq);
void ioq_putchar(struct ioqueue* ioq, char byte);
#endif

ioqueue.c

#include
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值