gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:33:53 26 4
gpt4 key购买 nike

我已经使用中断编写了一个简单的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;
}

最佳答案

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

如果您不想让写入阻塞,请查看 completions .

附注;有什么原因导致您无法在内核中使用标准 8250/16550 驱动程序吗?

关于c - 中断处理程序代码与用户代码同时执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23542699/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com