tasklet和work_queue的使用
最近和同事一起做驱动,同事负责USB接口,我负责SDIO接口,因为我前面还有其他工作,他负责所有框架性东西,最近发现一个很典型的问题。他 的数据通路都已经完全通了,我发现我的SDIO接口在读写数据的时候老是提示在中断中发生调度,且调度超时的BUG。后面仔细阅读代码才发现,他的数据发送和接收部分都是用tasklet来实现的,因为USB里面没有中断,发送urb没有等待队列,所以不会发生调度。但是sdio中CMD53/53都有使用到wait_queue_head_t这个机制,涉及到睡眠和调度。仔细查看tasklet发现tasklet是软中断的一种,在tasklet里面不能睡眠不能调度,找到问题所在。解决版本如下。把SDIO和USB接口分开,原USB框架不变,SDIO部分采用work_queue来实现读写,work_queue支持睡眠和调度,问题解决。
tasklet和work_queue的一点使用总结
最新推荐文章于 2021-05-08 15:52:05 发布