[英]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.