Skip to content

Latest commit

 

History

History
13 lines (10 loc) · 791 Bytes

File metadata and controls

13 lines (10 loc) · 791 Bytes

在调试dev模块时,我遇到这样一个问题:如果不创建任何线程(即只有dev->init()创建的dev_input_taskdev_tty_task两个线程),此时这两个线程会因为read()函数的信号量而双双陷入等待,造成schedule()函数的死循环。为了解决这个问题只要加入另一个trivial的线程供调度使用即可。

那么为什么这两个线程会被trivial的线程唤醒呢?其实并不是这个线程唤醒了它们,而是在初始化输入设备时注册了键盘中断和时钟中断的处理函数:

  os->on_irq(0, _EVENT_IRQ_IODEV, input_notify);
  os->on_irq(0, _EVENT_IRQ_TIMER, input_notify);
static _Context *input_notify(_Event ev, _Context *context) {
  kmt->sem_signal(&sem_kbdirq);
  return NULL;
}