0

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

4

3 回答 3

1

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

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

如果要调度用户进程,一种方法是将用户线程挂在信号量(内核内部)上并在 ISR 中插入信号量。

于 2013-03-05T17:51:07.473 回答
0

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

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

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

DECLARE_TASKLET(my_tasklet, 函数名, 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 *)) 函数名, NULL);

irqreturn_t my_tl_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
   schedule_work(&short_wq); 
   return IRQ_HANDLED;
}
于 2013-03-06T10:38:23.867 回答
0

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

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

于 2016-06-14T10:36:01.550 回答