当前位置: 技术问答>linux和unix
请教睡眠和usb的两个问题
来源: 互联网 发布时间:2016-04-11
本文导语: 1 看到某个驱动中对某个队列的睡眠操作如下: while(!flag) { interruptible_sleep_on(queue); } 在另外一个函数中有相应的唤醒操作: flag = 0; wake_up_interruptible(queue); 问题是为什么设定睡...
1 看到某个驱动中对某个队列的睡眠操作如下:
while(!flag)
{
interruptible_sleep_on(queue);
}
在另外一个函数中有相应的唤醒操作:
flag = 0;
wake_up_interruptible(queue);
问题是为什么设定睡眠时要用while判断?用if不行吗?难道interruptible_sleep_on之后进程不会睡眠在这里,而是会再回头接着判断while的条件flag是否为0?如果这样岂不是interruptible_sleep_on这句就没什么意义了?看到很多调用interruptible_sleep_on或是wait_interruptible时都是用while,请问这有什么原因。
2
usb的ctrl_urb,在usb_submit_urb成功之后,
回调函数ctrl_urb_callback是在新开的一个进程中执行、原进程接着执行usb_submit_urb下面的语句呢,还是在原来的进程中执行ctrl_urb_callback函数,等ctrl_urb_calllback执行完之后再接着执行usb_submit_urb之后的代码?不大明白回调函数代码和原来代码之间的执行顺序和关系,请指教一下,谢谢~
while(!flag)
{
interruptible_sleep_on(queue);
}
在另外一个函数中有相应的唤醒操作:
flag = 0;
wake_up_interruptible(queue);
问题是为什么设定睡眠时要用while判断?用if不行吗?难道interruptible_sleep_on之后进程不会睡眠在这里,而是会再回头接着判断while的条件flag是否为0?如果这样岂不是interruptible_sleep_on这句就没什么意义了?看到很多调用interruptible_sleep_on或是wait_interruptible时都是用while,请问这有什么原因。
2
usb的ctrl_urb,在usb_submit_urb成功之后,
回调函数ctrl_urb_callback是在新开的一个进程中执行、原进程接着执行usb_submit_urb下面的语句呢,还是在原来的进程中执行ctrl_urb_callback函数,等ctrl_urb_calllback执行完之后再接着执行usb_submit_urb之后的代码?不大明白回调函数代码和原来代码之间的执行顺序和关系,请指教一下,谢谢~
|
Q1: interruptible_sleep_on(queue) 应该是可以被中断的,被中断之后,如果还需要继续睡眠(flag=0),那么会再次进入睡眠! 我想这样做的目的是提高系统实时性
Q2:没太民明白这个问题的意思,根据我的理解,callback一般是在某个地方注册(即设置callback函数),然后在需要的时侯在调用它们? 至于是在一个进程还是两个进程? 这就要看程序的具体流程如何安排的!
GOOD LUCK!
Q2:没太民明白这个问题的意思,根据我的理解,callback一般是在某个地方注册(即设置callback函数),然后在需要的时侯在调用它们? 至于是在一个进程还是两个进程? 这就要看程序的具体流程如何安排的!
GOOD LUCK!
|
interruptible_sleep_on可以把signal中断,从而唤醒进程。 而驱动的本意是要通过wake_up_interruptible把它唤醒,这就是用while的缘故。
callback这个确实跟实现有关系的,一般就是一个某个地方加个hook,在另一个地方调用。
需要根据你的代码判断。
另外,interruptible_sleep_on已经过时了,所以建议你换成2.6的kernel,不要再用2.4的了。
2.6已经发布了N年了。
callback这个确实跟实现有关系的,一般就是一个某个地方加个hook,在另一个地方调用。
需要根据你的代码判断。
另外,interruptible_sleep_on已经过时了,所以建议你换成2.6的kernel,不要再用2.4的了。
2.6已经发布了N年了。