在《EM335x主板ISA總線的高級(jí)應(yīng)用》一文中介紹了WEC7版的ESM335x精簡ISA總線數(shù)據(jù)"塊"讀寫方法,對(duì)于多字節(jié)數(shù)據(jù)塊的連續(xù)讀寫,采用塊讀寫方式可以減少驅(qū)動(dòng)程序API的調(diào)用次數(shù),提高ISA總線的訪問效率。
數(shù)據(jù)塊讀寫功能是通過設(shè)備驅(qū)動(dòng)的DeviceIoControl來完成的,需要用到以下數(shù)據(jù)結(jié)構(gòu):
typedef struct
{
PBYTE pReadBuf; //ISA讀數(shù)據(jù)buffer, 只能一個(gè)buffer有效
PBYTE pWriteBuf; //ISA寫數(shù)據(jù)buffer, 只能一個(gè)buffer有效
DWORD dwDataLength; //length of data in byte
DWORD dwDataPortOfs; //讀寫的起始地址 = 0x00 – 0xFF
DWORD dwInc; //= 0: 固定地址, > 0: 讀寫后地址自動(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)行寫操作時(shí)的數(shù)據(jù)buffer,寫操作具體為8-bit數(shù)據(jù)讀。注意:數(shù)據(jù)結(jié)構(gòu)中,pReadBuf和pWrietBuf只能有一個(gè)有效。
dwDataPortOfs為讀寫的端口地址,范圍為0x00 – 0xFF。
dwDataLength為本數(shù)據(jù)塊讀或?qū)懙淖止?jié)數(shù)。
dwInc為每次讀寫后,地址的自動(dòng)增量,dwInc = 0:表示固定地址讀寫,dwInc > 0: 表示每次讀寫后,地址會(huì)自動(dòng)增加dwInc,作為下一次的讀寫地址。當(dāng)?shù)刂烦^0xFF時(shí),會(huì)折回到地址0x00。
數(shù)據(jù)塊讀寫方式雖然減少了頻繁調(diào)用系統(tǒng)API而產(chǎn)生的系統(tǒng)開銷,但數(shù)據(jù)讀寫過程還是需要CPU的全程參與,為了進(jìn)一步提高CPU的利用效率,我們升級(jí)了ISA的驅(qū)動(dòng)程序,實(shí)現(xiàn)了DMA方式的數(shù)據(jù)傳輸?;谥С諨MA操作的ISA驅(qū)動(dòng),應(yīng)用程序在調(diào)用DeviceIoControl進(jìn)行塊讀寫操作時(shí),如果訪問固定地址(即將設(shè)置參數(shù)dwInc為0),則驅(qū)動(dòng)程序就會(huì)自動(dòng)啟用DMA方式進(jìn)行數(shù)據(jù)傳輸。
采用DMA進(jìn)行數(shù)據(jù)傳輸可以進(jìn)一步提高ISA總線的數(shù)據(jù)傳輸速度,同時(shí)大大降低總線數(shù)據(jù)傳輸對(duì)CPU負(fù)載率的影響。當(dāng)不使用DMA進(jìn)行數(shù)據(jù)傳輸,ESM335x CPU全速運(yùn)行時(shí)(CPU負(fù)載100%),ISA總線的讀寫速度在3MB/s左右,使用DMA方式后,ESM335x ISA總線速度可達(dá)到5MB/s左右,扣除驅(qū)動(dòng)程序必要處理開銷,在應(yīng)用層實(shí)測的數(shù)據(jù)塊讀速度為4.17MB/s、數(shù)據(jù)塊寫速度為4.5MB/s,而此時(shí)CPU的負(fù)載率在15%左右。
-
嵌入式主板
+關(guān)注
關(guān)注
7文章
6084瀏覽量
35155
發(fā)布評(píng)論請先 登錄
相關(guān)推薦
評(píng)論