Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Linux中的微线程和中断问题_C_Linux_Linux Kernel_Driver_Tasklet - Fatal编程技术网

C Linux中的微线程和中断问题

C Linux中的微线程和中断问题,c,linux,linux-kernel,driver,tasklet,C,Linux,Linux Kernel,Driver,Tasklet,让我们假设Linux中有一个中断处理程序和一个tasklet。tasklet是从该中断处理程序调度的 中断处理程序充当某种生产者,而tasklet充当消费者。 当tasklet运行较长时间时会出现问题,当此tasklet仍在运行时会发生中断。这种干扰会导致日志中出现多个调用跟踪 如何解决这种干扰 我唯一的想法是将中断处理程序移动到某个工作队列或另一个tasklet,并从中断处理程序调度它 可以吗? 还有其他想法吗 系统编程的经验法则:在ISR中尽量少做。简短回答:修复代码中未显示的错误。如果代码

让我们假设Linux中有一个中断处理程序和一个tasklet。tasklet是从该中断处理程序调度的

中断处理程序充当某种生产者,而tasklet充当消费者。 当tasklet运行较长时间时会出现问题,当此tasklet仍在运行时会发生中断。这种干扰会导致日志中出现多个调用跟踪

如何解决这种干扰

我唯一的想法是将中断处理程序移动到某个工作队列或另一个tasklet,并从中断处理程序调度它

可以吗?
还有其他想法吗

系统编程的经验法则:在ISR中尽量少做。简短回答:修复代码中未显示的错误。如果代码导致调用跟踪,则修复代码。如果是ISR和tasklet之间的干预,并且您确定tasklet没有问题,则使用workqueue而不是tasklet。工作队列在进程上下文中运行,在出现新的中断时可以休眠。首先,这个问题中最有趣的是调用跟踪只出现在内核源中,而不出现在驱动程序中。第二,我在tasklet开始时禁用IRQ,在tasklet结束时启用IRQ,从而防止了干扰的发生。删除列表napi->poll\u list时,process\u backlog过程中出现问题调用跟踪,因为此过程尝试删除已删除的poll\u列表。请在tasklet代码周围使用自旋锁,自旋锁irqsave可禁用中断。如上所述,经验法则是在微线程中做一些小事情。