gpt4 book ai didi

multithreading - 为什么内核会用另一个线程调度irq处理程序?

转载 作者:行者123 更新时间:2023-12-03 13:04:27 25 4
gpt4 key购买 nike

我在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发生的时间;

它会像这样打印;



end the handler

in a kthread !





但实际上 ;

它会像这样打印:



in a kthread !

end the handler





谁可以给我解释一下这个 ?

最佳答案

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)。

仅用于文档(请参阅下面的注释): 事实证明这是多核效应,线程在不同的内核上运行,因此立即启动。

关于multithreading - 为什么内核会用另一个线程调度irq处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34738199/

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