ESM335x工控主板ISA总线DMA数据传输

 2018-6-5     作者:刘乾坤     [nemail]    
[lablebox]

  在《EM335x主板ISA总线的高级应用》一文中介绍了WEC7版的ESM335x精简ISA总线数据"块"读写方法,对于多字节数据块的连续读写,采用块读写方式可以减少驱动程序API的调用次数,提高ISA总线的访问效率。


  数据块读写功能是通过设备驱动的DeviceIoControl来完成的,需要用到以下数据结构:

  

typedef struct 
  { 
    PBYTE pReadBuf;                  // ISA读数据buffer, 只能一个buffer有效 
    PBYTE pWriteBuf;          // ISA写数据buffer, 只能一个buffer有效 
    DWORD dwDataLength;      // length of data in byte 
    DWORD dwDataPortOfs;     // 读写的起始地址 = 0x00 – 0xFF 
    DWORD dwInc;                     // = 0: 固定地址, > 0: 读写后地址自动增加 
  } ISA_BLOCK_INFO, *PISA_BLOCK_INFO;


  在上述数据结构中:

  pReadBuf为进行读操作时的数据buffer,读操作具体为8-bit数据读。注意:数据结构中,pReadBuf和pWrietBuf只能有一个有效。

  pWriteBuf为进行写操作时的数据buffer,写操作具体为8-bit数据读。注意:数据结构中,pReadBuf和pWrietBuf只能有一个有效。

  dwDataPortOfs为读写的端口地址,范围为0x00 – 0xFF。

  dwDataLength为本数据块读或写的字节数。

  dwInc为每次读写后,地址的自动增量,dwInc = 0:表示固定地址读写,dwInc > 0: 表示每次读写后,地址会自动增加dwInc,作为下一次的读写地址。当地址超过0xFF时,会折回到地址0x00。


  数据块读写方式虽然减少了频繁调用系统API而产生的系统开销,但数据读写过程还是需要CPU的全程参与,为了进一步提高CPU的利用效率,我们升级了ISA的驱动程序,实现了DMA方式的数据传输。基于支持DMA操作的ISA驱动,应用程序在调用DeviceIoControl进行块读写操作时,如果访问固定地址(即将设置参数dwInc为0),则驱动程序就会自动启用DMA方式进行数据传输。


  采用DMA进行数据传输可以进一步提高ISA总线的数据传输速度,同时大大降低总线数据传输对CPU负载率的影响。当不使用DMA进行数据传输,ESM335x CPU全速运行时(CPU负载100%),ISA总线的读写速度在3MB/s左右,使用DMA方式后,ESM335x ISA总线速度可达到5MB/s左右,扣除驱动程序必要处理开销,在应用层实测的数据块读速度为4.17MB/s、数据块写速度为4.5MB/s,而此时CPU的负载率在15%左右。

[lablebox]