0

我有一个正在处理的设备驱动程序。它是这样工作的:

1. User app sends ioctl cmd 0x01 to driver that puts it to sleep.
2. User app sends another ioctl cmd 0x02 to driver that wakes it up.

我这样做是因为我的硬件还没有准备好,所以我还没有可以与之交谈的设备。

问题:当我发送 ioctl cmd 0x01 让驱动程序进入睡眠状态时,我的用户应用程序会休眠/挂起,但是当我发送 ioctl cmd 0x02 时,它不会收到唤醒信号。我打印出信号量计数以查看发生了什么,并注意到对于每种情况,my_sem.count == 0 在调用 down()/up() 之前。

一般来说,我不明白的驱动程序是什么?对于我随用户应用程序发送的每个 ioctl cmd,我的 ioctl 处理程序似乎都有不同的 my_sem 副本。当我为 up() 发送几个连续的 cmd 时,我希望看到调用 up() 的每个 ioctl cmd 的计数增加,但它总是在 up() 之前打印出零,在 up() 之后打印出一个。

/* PSEUDO CODE */
// global defn
DEFINE_SEMAPHORE(my_sem);
.
.
.
// file ops ioctl handler
int foo_CharIoctl(struct file * file, 
              unsigned int cmd, 
              unsigned long arg)
{
    sema_init(&my_sem, 0);
.
.
.
    switch(cmd)
    {
        case 0x01:
            printf my_sem.count;
            down_killable(&my_sem);
            printf my_sem.count;
        case 0x02:
            printf my_sem.count;
            up(&my_sem);
            printf my_sem.count;
        ...
    }
}
4

1 回答 1

0

每次调用 foo_CharIoctl() 时,您似乎都在重新初始化信号量。sema_init() 应该放在您的驱动程序初始化中。

于 2015-04-21T18:03:44.417 回答