2013-03-05 50 views
0

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

+0

具体而言,我在用户模式进程中注册了一个用户模式irq处理程序。所以当中断到来时,我想立即跳转到用户模式处理程序,但是当do_IRQ中的当前进程不是我之前注册的进程时,我想进行上下文切换以获取我注册的进程运行。 – goodjesse 2013-03-07 02:21:43

回答

1

我不确定我是否正确理解你的问题,但你是指延期工作?

有既定的方式通过使用微进程等推迟在ISR的工作

如果你想安排一个用户进程,一个办法是挂起一个信号量的用户线程(在内核中),并捅ISR中的信号量。

+0

我在用户模式进程中注册了一个用户模式irq处理程序。所以当中断来临时,我可以直接跳到处理程序。我想让当前流程成为我注册的流程。 – goodjesse 2013-03-07 02:30:34

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

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

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

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

相关问题