中断处理程序代码与用户代码同时执行

时间:2014-05-08 13:08:53

标签: c linux-device-driver embedded-linux uart interrupt-handling

我已经使用interrupt编写了一个简单的UART驱动程序。现在我只传输数据。

用户空间中的write函数将数据复制到内核空间中的缓冲区。

现在在中断期间,内核空间中的数据从内核空间以字节方式(100次)复制到THR缓冲寄存器。

但是在中断处理程序完成它之前,close函数中的调试语句会被打印出来。这不是错误的方式吗?即我希望在处理函数的语句之后打印close函数的调试语句

下面的代码是处理函数,这个处理函数在copyfromuser函数

之后启用
irqreturn_t uart_handler(int irq, void *dev_id) 
{
    write_to_uart(bytes_written);
    printk(KERN_ALERT "index %d\n", Uindex);

    if (Uindex >= 100)
        iowrite32(0,io_map + 0x4);//IER THR disable

    printk(KERN_ALERT "out from if\n");

    return IRQ_HANDLED;
}

以下代码是write_to_uart

void write_to_uart(int nofbytes)
{
    if (((ioread32(io_map + 0x8)) & 0x2) == 0x2) {
        printk(KERN_ALERT "Interrupt activated\n");
        iowrite32((unsigned)((device_buffer)[Uindex]), io_map);
        Uindex++;
    } else {
        printk(KERN_ALERT "Interrupt not activated\n");
        printk(KERN_ALERT "IIR reg = %d\n", ioread32(io_map + 0x8));
    }
}

关闭功能无效

int uart_release(struct inode *inode, struct file *filp)
{
    printk(KERN_ALERT "DEVICE CLOSED\n");
    return 0;
}

1 个答案:

答案 0 :(得分:1)

由于中断处理程序中没有能够阻止write(2)调用的代码,因此数据将异步发送到UART。假设您在写入数据后(从用户空间感知)继续close(2)文件描述符;你所描述的行为正是我期望看到的。

如果您不想阻止写入,请查看completions

旁注;你有什么理由不能在内核中使用标准的8250/16550驱动程序吗?