我有一个正在处理的设备驱动程序。它的工作原理如下:
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处理程序为我用我的用户应用程序发送的每个ioctl cmd都有不同的my_sem副本。当我为up()发送几个连续的cmds时,我希望看到调用up()的每个ioctl cmd的计数增加,但是它总是在up()之前打印出ZERO而在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;
...
}
}
答案 0 :(得分:0)
每次调用foo_CharIoctl()时,您似乎都在重新初始化信号量。 sema_init()应该放在你的驱动程序初始化中。