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