阅读:1223回复:4
PCI驱动的问题
PCI卡实时接收高速数据的时候,在2000下
可以采用IRP排队,用异步的方式进行, 或则直接就采用地址映射方法 每次中断就直接通知。 我刚编完一个Linux下的bus master的PCI驱动 我是采用这样的方式: 首先read,启动传送,然后用sleen_on_interruptible 然后中断,interruptible_wake_up,然后读取数据 读完数据后启动下一次传送 我觉得这样做效率太低,然后我看有个 O_NONBLOCK. 但是我不知道怎么用,也不知道能不能象2000下那样 可以用多个ReadFile(read)来排队读取数据 不知道哪位高手能给在下指点一下迷津? |
|
沙发#
发布于:2003-05-11 16:01
那要做块设备的驱动了
|
|
|
板凳#
发布于:2003-05-11 16:28
[编辑 - 5/11/03 by gigimao] |
|
地板#
发布于:2003-05-12 00:40
WINDOWS的驱动的主干是irp,系统借此进行全面的协调和监控,同时也提供了比较方便的异步方式。Linux的驱动机制没有这么复杂,可以认为只是许多回调函数堆在一起。似乎也没有提供简单的异步机制。
我的看法是,不管上层的机制是怎么实现的,最底层的硬件驱动总是相似的。硬件本身并不能同时处理多笔数据,所有的数据还是要一笔一笔的交给硬件处理。 我觉得提高驱动效率的一个关键点是怎么优化程序的流程。比如在你的程序准备进入sleen_on_interruptible之前是不是还有些事情需要准备呢? |
|
地下室#
发布于:2003-05-12 12:37
谢谢
当时在2000下,我将系统空间映射成用户空间, 然后中断产生后启动下一次传送,并用事件通知 用户去处理数据,这样可以不用数据搬移 而在Linux下 我每回不得不在中断里面设置停止传送 在read里面设置启动传送,还要数据拷贝 效率不免低了一点, 有没有更好的办法? |
|