對工控主板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的負載不合理的升高。
成都英創信息技術有限公司 028-8618 0660