如何在中断处理程序中进行上下文切换?

时间:2013-03-05 01:47:35

标签: linux linux-kernel

是否可以在中断处理程序中执行上下文切换以安排我之前注册的另一个进程?如果是,怎么样?

3 个答案:

答案 0 :(得分:1)

我不确定我是否理解你的问题,但你指的是推迟工作吗?

有一些确定的方法可以通过使用tasklet等来推迟ISR中的工作。

如果要安排用户进程,一种方法是将用户线程挂在信号量上(在内核中)并在ISR中戳出信号量。

答案 1 :(得分:0)

好的,首先,你不能在中断部分切换上下文,即上半部分。

但是,您可以安排另一个函数在中断上下文或进程上下文中运行。 实现这一目标的方法是中断处理程序的下半部分。

1:如果要安排注册的函数在中断上下文中运行,请使用Tasklet。

DECLARE_TASKLET(my_tasklet,functionname,0);

irqreturn_t my_tl_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
   tasklet_schedule(&my_tasklet);
   return IRQ_HANDLED;
}

2:如果要安排注册的函数在进程上下文中运行,请使用workqueue。

INIT_WORK(& my_wq,(void(*)(void *))functionname,NULL);

irqreturn_t my_tl_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
   schedule_work(&short_wq); 
   return IRQ_HANDLED;
}

答案 2 :(得分:0)

不能在中断上下文中进行上下文切换。在调度程序被禁用时,无法抢占在中断上下文中运行的任务。

在下半部分的情况下,softirq和tasklet都在中断上下文中运行,因此不允许像睡眠调用这样的上下文切换。但是如果工作队列下半部分上下文切换是可能的,因为它在进程上下文ksoftirqd中运行。