1. 项目背景与目标
这次驱动移植项目源于一个实际需求:为中泰联创的数据采集卡在Windows 7系统下提供稳定可靠的驱动支持。核心硬件基于PLX PCI9054桥接芯片,这是一个在工业控制领域广泛使用的PCI接口芯片。我们的任务是将原有的驱动代码进行现代化改造,使其能够在Windows 7环境下稳定运行,同时优化数据传输性能。
这个项目有几个关键挑战:
- 需要将原有的C++代码转换为更符合内核驱动开发规范的C语言实现
- 必须处理好DMA传输与中断处理的协同工作
- 要确保在Windows 7的PnP安全模型下能够正常运行
- 需要构建高效的软件FIFO缓冲机制来处理高速数据采集
2. 软件FIFO的实现与优化
2.1 SFIFO结构设计
软件FIFO是整个驱动数据流处理的核心组件。我们基于原有C++实现重新设计了一个C语言版本,主要包含以下关键元素:
c复制typedef struct _SFIFO_ELEMENT {
PVOID pData;
ULONG ulSize;
} SFE, *PSFE;
typedef struct _SOFTWARE_FIFO {
PSFE pElements;
ULONG ulCapacity;
ULONG ulHead;
ULONG ulTail;
KSPIN_LOCK SpinLock;
KEVENT DataAvailableEvent;
BOOLEAN bDmaInProgress;
} SFIFO, *PSFIFO;
这个设计有几个值得注意的特点:
- 使用循环缓冲区结构提高内存利用率
- 引入自旋锁(SpinLock)保证多线程安全
- 使用内核事件(KEVENT)实现高效的线程同步
- 专门标记DMA传输状态(bDmaInProgress)
2.2 关键操作函数实现
批量读写是SFIFO的核心功能。我们实现了以下关键函数:
c复制NTSTATUS SFifoWriteBulk(
PSFIFO pFifo,
PVOID pData,
ULONG ulSize,
BOOLEAN bFromDma
);
NTSTATUS SFifoReadB
