为什么内核会将irq处理程序安排到另一个线程?

时间:2016-01-12 07:54:03

标签: multithreading linux-kernel

当我在linux中使用irq处理程序时,我遇到了一个问题;

我用request_irq注册一个处理程序;

当外部硬件发送中断时可以调用它;

在irq处理程序中

,代码编程如下;

irqreturn_t irq_test_handler(int irq, void *desc)
{
wake_up_process(a_thread_handle);
mdelay(10);
printk("end the handler\n");
return IRQ_HANDLED;
}

a_thread_handle来自函数:kthread_create(a_kthread ....);

in a_kthread()
{
printk("in a kthread !\n");
}

所以在我看来,当irq发生时;

它会像这样打印;

"

  

结束处理程序

     

在kthread中!

"

但事实上;

它会像这样打印:

"

  

在kthread中!

     

结束处理程序

"

有人可以向我解释一下吗?

1 个答案:

答案 0 :(得分:1)

wake_up_process()所要做的就是request_threaded_irq()提供的内容。致电request_irq()request_threaded_irq()相同,但与thread_fn=NULL相同。如果你提供你的线程并返回IRQ_WAKE_THREAD,你的线程将在你的处理函数完成后被唤醒。我认为这是你的初衷(见here)。

如果这是多核效应,请尝试将您的系统设置为单核

#!/usr/bin/sudo bash
CPU_DIR="/sys/devices/system/cpu"
NEXT=$(( 1 - $( cat ${CPU_DIR}/cpu1/online ) ))
for d in /sys/devices/system/cpu/cpu*
do
  CPU=${d##*/}
  if [ ${CPU} == "cpuidle" ]; then continue; fi
  if [ ${CPU} == "cpu0" ]; then continue; fi
  echo -n $CPU $( cat $d/online )
  echo "${NEXT}" >$d/online
  echo " => " $( cat $d/online )
done

然后再试一次。第一个呼叫是单核,第二个呼叫。您还可以使用内核参数nosmpmaxcpus=0重新启动以完全禁用SMP激活(请参阅here)。

仅用于文档(请参阅下面的评论): 结果证明这是一个多核心效果,线程在不同的核心上运行,因此立即开始。