当我在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中!
结束处理程序
"
有人可以向我解释一下吗?
答案 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
然后再试一次。第一个呼叫是单核,第二个呼叫。您还可以使用内核参数nosmp
或maxcpus=0
重新启动以完全禁用SMP激活(请参阅here)。
仅用于文档(请参阅下面的评论): 结果证明这是一个多核心效果,线程在不同的核心上运行,因此立即开始。