EM335x主板c的高级应用

供稿:成都英创信息技术有限公司

  • 关键词:EM335x主板,EM335x主板
  • 作者:emtronix
  • 摘要:本文将介绍在Windows CE平台上,通过精简ISA总线进行数据块读写的方法。所谓数据块读写,是指一次API调用对一个地址端口读写多个数据的操作。数据块读写能有效提高数据读写的效率,在数据采集传输中有广泛的应用。

  对工控主板EM335x精简ISA扩展总线基本读写操作的介绍,已包含在EM335x编程手册中。本文将介绍在Windows CE平台上,通过精简ISA总线进行数据块读写的方法。所谓数据块读写,是指一次API调用对一个地址端口读写多个数据的操作。数据块读写能有效提高数据读写的效率,在数据采集传输中有广泛的应用。


  要对ISA总线进行读写,首先需要打开设备文件“ISA1:”如下:


  打开ISA文件

  HANDLE hISA;

  hISA = CreateFile(_T('ISA1:'), // name of device

    GENERIC_READ|GENERIC_WRITE, // desired access

    FILE_SHARE_READ|FILE_SHARE_WRITE, // sharing mode

    NULL, // security attributes (ignored)

    OPEN_EXISTING, // creation disposition

    FILE_FLAG_RANDOM_ACCESS, // flags/attributes

    NULL); // template file (ignored)


  数据块读写功能是通过设备驱动的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。


  如果要进行单一数据块读写功能,只需定义一个ISA_BLOCK_INFO结构变量,如BlockInfo,并按照应用需求填写相应的参数。然后就可调用系统API进行设置了:

  ISA_BLOCK_INFO BlockInfo;


  memset(&BlockInfo, 0, sizeof(ISA_BLOCK_INFO));

  // 填写输入参数值BlockInfo...


  对读操作,直接调用标准读函数:

  DWORD dwNbBytesRead = 0;

  BOOL bRet = ReadFile(hISA, // 打开“ISA1:”返回的Handler

    &BlockInfo, // 输入数据结构指针

    sizeof(ISA_BLOCK_INFO), // 数据结构Size

    &dwNbByteRead, NULL);


  对写操作则为:

  DWORD dwNbBytesWritten = 0;

  BOOL bRet = WriteFile(hISA, // 打开“ISA1:”返回的Handler

    &BlockInfo, // 输入数据结构指针

    sizeof(ISA_BLOCK_INFO), // 数据结构Size

    &dwNbByteWritten, NULL);


  如果要执行混合的数据块的读写操作,则需要定义ISA_BLOCK_INFO数组,并根据实际应用填写数组参数。例如需要进行3组数据块读写,实现代码如下:

  ISA_BLOCK_INFO BlockInfo[3];

  DWORD dwTotalSize = sizeof(ISA_BLOCK_INFO) * 3;


  memset(BlockInfo, 0, dwTotalSize);

  // 填写输入参数值BlockInfo...


  BOOL bRet = DeviceIoControl(hISA, // 打开“ISA1:”返回的Handler

    0, // 无需定义命令码,置为0

    (LPVOID)BlockInfo, // 块读写数据结构变量指针

    dwTotalSize, // 整个结构数组的size

    NULL, 0, // 不使用这组参数

    NULL, NULL);

  

  上述操作的主要特点是提高访问ISA总线的效率,因为每次调用驱动程序API,都会有一个几微秒的系统开销。对多字节的数据块读写,这样的开销应用程序就需要注意,否则会发现CPU的负载不合理的升高。

发布时间:2016年7月11日 16:14  人气:   审核编辑(王静 )
更多内容请访问(成都英创信息技术有限公司
相关链接

我有需求