我有一个正在处理的设备驱动程序。它是这样工作的:
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;
...
}
}