對工控主板EM335x精簡ISA擴展總線基本讀寫操作的介紹,已包含在EM335x編程手冊中。本文將介紹在Windows CE平臺上,通過精簡ISA總線進行數(shù)據(jù)塊讀寫的方法。所謂數(shù)據(jù)塊讀寫,是指一次API調(diào)用對一個地址端口讀寫多個數(shù)據(jù)的操作。數(shù)據(jù)塊讀寫能有效提高數(shù)據(jù)讀寫的效率,在數(shù)據(jù)采集傳輸中有廣泛的應(yīng)用。
要對ISA總線進行讀寫,首先需要打開設(shè)備文件“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)
數(shù)據(jù)塊讀寫功能是通過設(shè)備驅(qū)動的DeviceIoControl來完成的,需要用到以下數(shù)據(jù)結(jié)構(gòu):
typedef struct
{
PBYTE pReadBuf;//ISA讀數(shù)據(jù)buffer, 只能一個buffer有效
PBYTE pWriteBuf;//ISA寫數(shù)據(jù)buffer, 只能一個buffer有效
DWORD dwDataLength;//length of data in byte
DWORD dwDataPortOfs;//讀寫的起始地址 = 0x00 – 0xFF
DWORD dwInc;//= 0: 固定地址, > 0: 讀寫后地址自動增加
} ISA_BLOCK_INFO, *PISA_BLOCK_INFO;
在上述數(shù)據(jù)結(jié)構(gòu)中:
pReadBuf為進行讀操作時的數(shù)據(jù)buffer,讀操作具體為8-bit數(shù)據(jù)讀。注意:數(shù)據(jù)結(jié)構(gòu)中,pReadBuf和pWrietBuf只能有一個有效。
pWriteBuf為進行寫操作時的數(shù)據(jù)buffer,寫操作具體為8-bit數(shù)據(jù)讀。注意:數(shù)據(jù)結(jié)構(gòu)中,pReadBuf和pWrietBuf只能有一個有效。
dwDataPortOfs為讀寫的端口地址,范圍為0x00 – 0xFF。
dwDataLength為本數(shù)據(jù)塊讀或?qū)懙淖止?jié)數(shù)。
dwInc為每次讀寫后,地址的自動增量,dwInc = 0:表示固定地址讀寫,dwInc > 0: 表示每次讀寫后,地址會自動增加dwInc,作為下一次的讀寫地址。當(dāng)?shù)刂烦^0xFF時,會折回到地址0x00。
如果要進行單一數(shù)據(jù)塊讀寫功能,只需定義一個ISA_BLOCK_INFO結(jié)構(gòu)變量,如BlockInfo,并按照應(yīng)用需求填寫相應(yīng)的參數(shù)。然后就可調(diào)用系統(tǒng)API進行設(shè)置了:
ISA_BLOCK_INFO BlockInfo;
memset(&BlockInfo, 0, sizeof(ISA_BLOCK_INFO));
//填寫輸入?yún)?shù)值BlockInfo...
對讀操作,直接調(diào)用標(biāo)準(zhǔn)讀函數(shù):
DWORD dwNbBytesRead = 0;
BOOL bRet = ReadFile(hISA,//打開“ISA1:”返回的Handler
&BlockInfo,//輸入數(shù)據(jù)結(jié)構(gòu)指針
sizeof(ISA_BLOCK_INFO),//數(shù)據(jù)結(jié)構(gòu)Size
&dwNbByteRead, NULL);
對寫操作則為:
DWORD dwNbBytesWritten = 0;
BOOL bRet = WriteFile(hISA,//打開“ISA1:”返回的Handler
&BlockInfo,//輸入數(shù)據(jù)結(jié)構(gòu)指針
sizeof(ISA_BLOCK_INFO),//數(shù)據(jù)結(jié)構(gòu)Size
&dwNbByteWritten, NULL);
如果要執(zhí)行混合的數(shù)據(jù)塊的讀寫操作,則需要定義ISA_BLOCK_INFO數(shù)組,并根據(jù)實際應(yīng)用填寫數(shù)組參數(shù)。例如需要進行3組數(shù)據(jù)塊讀寫,實現(xiàn)代碼如下:
ISA_BLOCK_INFO BlockInfo[3];
DWORD dwTotalSize = sizeof(ISA_BLOCK_INFO) * 3;
memset(BlockInfo, 0, dwTotalSize);
//填寫輸入?yún)?shù)值BlockInfo...
BOOL bRet = DeviceIoControl(hISA,//打開“ISA1:”返回的Handler
0,//無需定義命令碼,置為0
(LPVOID)BlockInfo,//塊讀寫數(shù)據(jù)結(jié)構(gòu)變量指針
dwTotalSize,//整個結(jié)構(gòu)數(shù)組的size
NULL, 0,//不使用這組參數(shù)
NULL, NULL);
上述操作的主要特點是提高訪問ISA總線的效率,因為每次調(diào)用驅(qū)動程序API,都會有一個幾微秒的系統(tǒng)開銷。對多字節(jié)的數(shù)據(jù)塊讀寫,這樣的開銷應(yīng)用程序就需要注意,否則會發(fā)現(xiàn)CPU的負載不合理的升高。
相關(guān)閱讀:《ESM335x工控主板ISA總線DMA數(shù)據(jù)傳輸》
-
WINDOWS
+關(guān)注
關(guān)注
4文章
3552瀏覽量
88810 -
嵌入式主板
+關(guān)注
關(guān)注
7文章
6085瀏覽量
35402
發(fā)布評論請先 登錄
相關(guān)推薦
評論