使用DMA访问高速串行端口

Moh*_*ari 4 c# serial-port dma directmemory

我在c#中使用serialport组件,效果很好!但问题是如何更快地处理高速(例如2 Mbps)数据传输.

正如我研究过的那样,我发现可以直接访问内存(使用像这个链接的 DMA ).谁能告诉我如何在我的应用程序中定义和使用它?

Han*_*ant 7

不,[c#]标签将这一百万英里放在遥不可及的地方.该网页上的代码片段不是真实的,它只是一个"模式".它做了你在C#中无法做的事情,比如处理中断,获取缓冲区的物理内存地址,直接编程设备寄存器.在可以执行C#代码的计算机上,不计算Micro Framework,这只能由设备驱动程序完成.

这将是一种可以在微控制器上运行的代码,这种处理器不能与受保护模式的操作系统一起运行.即便如此,它仍然是伸展的,它通过未声明的魔法调用DMA,例如从未实际开始传输.也没有DMA控制器的迹象,需要仲裁设备之间的总线访问.这是假代码.

当您使用真实硬件时,您总是会得到一个带有它的设备驱动程序,负责与设备通信.如果设备实际上支持DMA,非常不寻常,那么设备驱动程序员就不会避免使用它.您在C#程序中使用的SerialPort类使用操作系统api,这是一种适用于任何类型串行端口设备的通用API.它将您的I/O请求传递给设备驱动程序以完成工作.

IOCTL涵盖操作系统api和设备驱动程序之间的接口. 此MSDN页面记录了Windows的页面.IOCTL和api之间有一个非常接近的匹配,api层非常薄.当你仔细观察时,很明显它们都没有与DMA有任何关系.他们不能,这是严格的驱动程序实现细节.