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