请教睡眠和usb的两个问题

发布于 2022-09-22 10:55:39 字数 715 浏览 34 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

一身软味 2022-09-29 10:55:39

首先,第一个问题:睡眠醒来过后,需要判断其到底是不是真正的由需要唤醒它的地方唤醒他的——因为有可能其他地方,譬如说信号等唤醒了该进程,所以这里只是一个检查。
第二个问题:建议楼主理清回调函数的意义及用法,可以在网上查找一下,可以参考下面我查到的一些参考:
http://hi.baidu.com/spidermanzy/ ... 69c6097bf48016.html

旧人 2022-09-29 10:55:39

水平有限,帮顶吧

乖乖 2022-09-29 10:55:39

第二个问题,没找到你说的回调函数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);

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文