對工控主板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的負載不合理的升高。
相關閱讀:《ESM335x工控主板ISA總線DMA數據傳輸》
-
WINDOWS
+關注
關注
4文章
3556瀏覽量
89081 -
嵌入式主板
+關注
關注
7文章
6086瀏覽量
35511
發布評論請先 登錄
相關推薦
評論