keyboardHandle 要做的事情就两件: 1. 将读取到的 keyCode 放入到 keyBuffer 中 2. 唤醒阻塞在 dev[STD_IN] 上的一个进程
时间: 2024-02-17 13:03:34 浏览: 38
下面是 keyboardHandle 函数的代码:
```
void keyboardHandle(uint32_t irq) {
uint8_t scanCode = inByte(0x60); // 从键盘控制器的数据端口读取扫描码
if (bufferHead != (bufferTail - 1 + MAX_KEYBUFFER_SIZE) % MAX_KEYBUFFER_SIZE) {
keyBuffer[bufferHead] = scanCode; // 将扫描码存储到 keyBuffer 中
bufferHead = (bufferHead + 1) % MAX_KEYBUFFER_SIZE; // 更新缓冲区头指针
}
// 唤醒阻塞在 dev[STD_IN] 上的一个进程
if (dev[STD_IN].value == -1) {
wakeup(&dev[STD_IN]);
dev[STD_IN].value = 0;
dev[STD_IN].state = 1;
}
}
```
上面的代码中,首先从键盘控制器的数据端口读取扫描码,并将其存储到 keyBuffer 中。如果 keyBuffer 中还有空余空间,则将扫描码存储到 keyBuffer 中,并更新缓冲区头指针。然后检查是否有进程被阻塞在输入设备上,如果有,则唤醒其中的一个进程,并将输入设备状态设置为可读状态。注意,这里只唤醒其中的一个进程,因为最多只能有一个进程被阻塞在输入设备上。如果没有进程被阻塞,则不进行任何操作。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)