From 6f5ceab63ad7ddf7197b5cdf9cf3f21048efca56 Mon Sep 17 00:00:00 2001 From: acevest Date: Tue, 24 Sep 2024 23:12:54 +0800 Subject: [PATCH] =?utf8?q?=E6=81=A2=E5=A4=8D=E7=A1=AC=E7=9B=98=E4=B8=AD?= =?utf8?q?=E6=96=AD=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- drivers/ide.c | 31 +++++++++++++++---------------- kernel/task_disk.c | 2 +- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/drivers/ide.c b/drivers/ide.c index 902a971..1aaad36 100644 --- a/drivers/ide.c +++ b/drivers/ide.c @@ -115,35 +115,34 @@ void ide_irq_bh_handler(void *arg) { ide_pci_controller_t *ide_ctrl = ide_pci_controller + channel; - int r = atomic_read(&(ide_ctrl->request_cnt)); - int i = atomic_read(&(ide_ctrl->irq_cnt)); - int c = atomic_read(&(ide_ctrl->consumed_cnt)); - - printlxy(MPL_IDE0 + channel, MPO_IDE, "IDE%d req %u irq %u consumed %u", channel, r, i, c); -} - -void ide_irq_handler(unsigned int irq, pt_regs_t *regs, void *devid) { - // printk("ide irq %d handler pci status: 0x%02x\n", irq, ata_pci_bus_status()); - int channel = irq == ide_pci_controller[0].irq_line ? 0 : 1; - - const int drvid = (channel << 1); // 虚拟一个 - ide_pci_controller_t *ide_ctrl = ide_pci_controller + channel; + // 读相关status寄存器 + const int drvid = (channel << 1); // 虚拟一个drvid ide_ctrl->status = inb(REG_STATUS(drvid)); ide_ctrl->pci_status = inb(ide_ctrl->bus_status); + // atomic_inc(&ide_ctrl->irq_cnt); - ata_dma_stop(channel); + // + int r = atomic_read(&(ide_ctrl->request_cnt)); + int i = atomic_read(&(ide_ctrl->irq_cnt)); + int c = atomic_read(&(ide_ctrl->consumed_cnt)); + printlxy(MPL_IDE0 + channel, MPO_IDE, "IDE%d req %u irq %u consumed %u", channel, r, i, c); // 之前这里是用up()来唤醒磁盘任务 // 但在中断的底半处理,不应该切换任务,因为会引起irq里的reenter问题,导致不能再进底半处理,也无法切换任务 // 所以就移除了up()里的 schedule() // 后来就改用完成量来通知磁盘任务,就不存在这个问题了 - // complete会唤醒进程,但不会立即重新调度进程 complete(&ide_ctrl->intr_complete); +} + +void ide_irq_handler(unsigned int irq, pt_regs_t *regs, void *devid) { + // printk("ide irq %d handler pci status: 0x%02x\n", irq, ata_pci_bus_status()); + int channel = irq == ide_pci_controller[0].irq_line ? 0 : 1; + + ata_dma_stop(channel); - // 纯debug打印 add_irq_bh_handler(ide_irq_bh_handler, (void *)channel); } diff --git a/kernel/task_disk.c b/kernel/task_disk.c index e1f15d1..32259af 100644 --- a/kernel/task_disk.c +++ b/kernel/task_disk.c @@ -69,7 +69,7 @@ void disk_task_entry(void *arg) { int channel = (int)arg; ide_pci_controller_t *ide_ctrl = ide_pci_controller + channel; -#if 0 +#if 1 // 为了在DEBUG时看到RUN int cnt = 2; for (int i = 0; i < cnt; i++) { -- 2.44.0