使用“ wait_event_inetrruptible”时如何解决“ BUG:原子时调度:...”

时间:2019-08-04 22:22:35

标签: linux block wait interrupt

我们需要能够使用中断从用户空间唤醒进程的功能。

为此,我们正在执行以下操作: ·用户空间程序–与ioctl()一起进入内核空间并调用等待que_head。 此时,用户空间线程块。 ·发生中断时,它会向内核空间调用另一个ioctl()并唤醒内核进程。 ·此时,用户空间程序将不再阻塞并继续执行。

这是使用以下伪代码实现的:

static DECLARE_WAIT_QUEUE_HEAD(int0_wait);
static u32 int0_wait_flag = 0 ;

*/ inside the Kernel ioctl function */
case WAIT_INT_0:
                wait_event_inetrruptible(int0_wait, int0_wait_flag !=0);  /* blocked here */
                int0_wait_flag = 0;
                printk("Returning from IOCTL kernel …\n");
                break;

/* interrupt handler */
Irqreturn_t irq_handler(int irq, void *dev)
{
                Int0_eait_flag = 1;
                wake_up_interruptible(&int0_wait);
                return IRQ_HANDLED;
}

/* a user space test program */

Int_function()
{
                ioctl(…, WAIT_INT_0, …);              /* call the kernel for blocking */
                /* comes here when IRQ arrives */
                /* continue with run the rest of code…. */

当我们这样做时–我们几乎总是在内核中得到一个BUG: […..]呼叫跟踪: […..] BUG:原子调度:TesterCpp / 2000 / 0x00000200 ……

0 个答案:

没有答案