我正在为没有DMA的设备编写驱动程序。
驱动程序启动设备操作,然后定期从设备中提取 busy 标志等待操作完成。
操作需要4.5或9微秒才能完成。在任何情况下设备都不会提前完成操在指定的时间(9微秒)之后读取设备状态不会产生错误。
Busywait
Internet上发现的所有内核文章都告诉busywait这个小的间隔。他们认为,任何睡眠操作都会浪费更多的资源而不是忙碌。就个人而言,我不喜欢在琐碎的等待中浪费周期。
定时/睡眠
我发现在使用整个CPU schedule()
调用的进程的目标硬件上,导致其他线程(在空处理器上没有其他线程)可以在设备操作完成之前调用最多4次。当我添加更多虚拟进程来加载CPU时,我看到我的驱动程序中的调度调用为同时运行的进程提供了更公平的CPU分配。
我应该在等待设备时调用schedule()
甚至usleep_range()
,还是应该依靠内核抢占来处理忙碌等待?
答案 0 :(得分:0)
根据Documentation/timers/timers-howto.txt,usleep_range
是你想要的最新内核。
[更新:哎呀!我应该仔细阅读一下。对于< 10us,它说使用udelay
。所以我想这取决于你愿意睡多久。]