键盘驱动
- 按键按下时的编码是
通码
,makecode - 按键弹起时的编码是
断码
,breakcode
一个键的扫描码由通码和断码组成。
无论是按下键还是松开键,当键的状态改变的时候,键盘中的8048芯片把按键对应的扫描码(通码或者断码)发送到主板的8042芯片,由8042芯片处理后保存在自己的寄存器中,然后向8042芯片发送中断请求。
大多数情况下第一套扫描码中的通码和断码都是1字节大小。通码和断码,它们的关系是:断码=0x80 +通码。 顺便说一句, 在第二套键盘扫描码中, 一般的通码是 1 宇节大小,断码是在通码 前再加 1 字节的 0xF0,共2 字节,我们的 8042 工作之一就是根据第二套扫描码中通码和断码的关系将它们解码,然后按照第一套扫描码中通码和断码的关系转换成第一套扫描码。
- 扫描码有 3 套,现在一般键盘中的 8048 芯片支持的是第二套扫描码。因此每当有击键发生时, 8048 发给 8042 的都是第二套键盘扫描码。
- 8042 为了兼容性,将接收到的第二套键盘扫描码转换成第一套扫描码。 8042 是按字节来处理的, 每处理一个字节的扫描码后,将其存储到自己的输出缓冲区寄存器。
- 然后向中断代理 8059A 发中断信号,这样我们的键盘中断处理程序通过读取 8042 的输出缓冲区寄存器,会获得第一套键盘扫描码。
环形输入缓冲区
实现
结构:逻辑上唤醒的循环队列
生产者消费者问题
生产者消费者问题是用来描述多个线程协同工作的模型
有一个或多个生产者、 一个或多个消费者和一个固定大小 的缓冲区,所有生产者和消费者共享这同一个缓冲区。生产者 生产某种类型的数据,每次放一个到缓冲区中,消费者消费这种数据,每次从缓冲区中消费一个。同一时刻,缓冲区只能被一个生产者或消费者使用。当缓冲区已满时,生产者不能继续往缓冲区中添加数据,当缓冲区为空时,消 费者不能在缓冲区中消费数据。