繁体   English   中英

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

[英]Interrupt handler code executed concurrently with the user code

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

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

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

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

下面的代码是处理程序函数,在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;
}

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

如果您不想使写入受阻,请看一下完成

附带说明; 有什么原因为什么您不能在内核中使用标准的8250/16550驱动程序?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM