请教睡眠和usb的两个问题
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之后的代码?不大明白回调函数代码和原来代码之间的执行顺序和关系,请指教一下,谢谢~
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
首先,第一个问题:睡眠醒来过后,需要判断其到底是不是真正的由需要唤醒它的地方唤醒他的——因为有可能其他地方,譬如说信号等唤醒了该进程,所以这里只是一个检查。
第二个问题:建议楼主理清回调函数的意义及用法,可以在网上查找一下,可以参考下面我查到的一些参考:
http://hi.baidu.com/spidermanzy/ ... 69c6097bf48016.html
水平有限,帮顶吧
第二个问题,没找到你说的回调函数ctrl_urb_callback。
对于storage模块回调函数的实现是这样的:
usb_stor_control_thread线程被一个来的scsi_cmnd激活后,回调函数done已被存在srb中,srb->scsi_done = done;
usb_stor_control_thread在调用了usb_submit_urb后一直wait,等wait到后就执行done : us->srb->scsi_done(us->srb);