一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何快速訪問ISA總線端口

英創(chuàng)信息技術(shù) ? 作者:英創(chuàng)信息技術(shù) ? 2019-09-26 10:35 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

精簡ISA總線是英創(chuàng)工控主板的特色之一,我們基于ISA總線推出了多串口、多網(wǎng)口、多CAN接口等擴展模塊,我們的很多用戶也基于ISA總線設計了自己的專有擴展單元并取得了成功。為了充分發(fā)揮ISA總線的性能,對于ISA總線的訪問,我們除了提供最基本的設備驅(qū)動API操作函數(shù)外,還先后增加了ISA總線的塊讀寫操作方法和ISA總線的DMA操作方法。當ISA總線以DMA方式進行數(shù)據(jù)傳輸時,在最大限度的利用ISA總線帶寬的同時,又減少了ISA操作占用CPU的時間,所以利用DMA是進行批量數(shù)據(jù)傳輸時的首選方式。

在實際的應用中,除了成批量的數(shù)據(jù)訪問外,也可能會存在對外設進行頻繁的字或字節(jié)訪問。英創(chuàng)主板的ISA總線周期通常在200ns左右,而應用程序調(diào)用一次設備驅(qū)動程序API(WriteFile,ReadFile)花費的時間卻需要數(shù)微秒的時間,這顯然大大降低了對外設單字(或單字節(jié))的訪問效率。為了解決這一問題,我們利用了WinCE的虛擬地址映射技術(shù),在ISA驅(qū)動程序中實現(xiàn)了在使用ISA的應用進程地址空間內(nèi)分配一段虛擬地址空間,并將其與ISA接口的物理地址空間進行了綁定。簡單來講就是實現(xiàn)了在WinCE應用程序中可以直接訪問ISA總線的外設地址空間,從使用的角度看,我們實現(xiàn)了以下5個函數(shù)。ISAMmMap用于獲得ISA總線的基地址,其余4個函數(shù)分別為字讀/寫和字節(jié)讀/寫操作函數(shù)。

HANDLE ISAMmMap(HANDLE hISA); // 映射ISA總線物理地址空間
BYTE ISARead8(HANDLE hMmMap, DWORD dwPortOffset); // 讀單字節(jié)
void ISAWrite8(HANDLE hMmMap, DWORD dwPortOffset, BYTE ucValue); // 寫單字節(jié)
WORD ISARead16(HANDLE hMmMap, DWORD dwPortOffset); // 讀單字
void ISAWrite16(HANDLE hMmMap, DWORD dwPortOffset, WORD wValue); // 寫單字


下面是上述5個函數(shù)實現(xiàn)的源代碼,在ISAMmMap函數(shù)中調(diào)用DeviceIoControl,通過IOCTL_VIRTUAL_COPY_EX命令獲取ISA總線的基地址。

// Function: Get the base address of ISA Port
// Input: hISA: Handle of ISA1:
// Return: Base address of the ISA Port
HANDLE ISAMmMap(HANDLE hISA)
{
DWORD dwMemBase;
if(DeviceIoControl(hISA, //打開“ISA1:”返回的Handler
IOCTL_VIRTUAL_COPY_EX, // IOCTL命令碼
NULL,0, // 不使用輸入?yún)?shù)
&dwMemBase, sizeof(DWORD), // 得到ISA基地址
NULL, NULL))
return (HANDLE)dwMemBase;
return NULL;
}
// Function: read a byte from a port on ISA bus
// Input: hMmMap: Base address of the ISA Port
// dwPortOffset = 0, 1, .. 255, address of port on ISA
// Return: the byte data read
BYTE ISARead8(HANDLE hMmMap, DWORD dwPortOffset)
{
WORD *pPortAddr;
WORD wValue;
dwPortOffset &= 0xff;
dwPortOffset <<= 1;?????????????? // D[0..7] <=> A[1..8] in AD-muxed mode
pPortAddr = (WORD*)((DWORD)hMmMap + dwPortOffset);
wValue = *pPortAddr;
return (BYTE)wValue;
}
// Function: write a byte to a port on ISA bus
// Input: hMmMap: Base address of the ISA Port//
// dwPortOffset = 0, 1, .. 255, address of port on ISA
// ucValue = the byte data to be written
void ISAWrite8(HANDLE hMmMap, DWORD dwPortOffset, BYTE ucValue)
{
WORD *pPortAddr;
dwPortOffset &= 0xff;
dwPortOffset <<= 1;?????????????? // D[0..7] <=> A[1..8] in AD-muxed mode
pPortAddr = (WORD*)((DWORD)hMmMap + dwPortOffset);
*pPortAddr = (WORD)ucValue;
}
// Function: read a word from a port on ISA bus
// Input: hMmMap: Base address of the ISA Port
// dwPortOffset = 0, 2, 4, .. 254, address of port on ISA
// Return: the word data read
WORD ISARead16(HANDLE hMmMap, DWORD dwPortOffset)
{
DWORD *pPortAddr;
DWORD dwValue;
dwPortOffset &= 0xFE; // 2-byte alignment
dwPortOffset <<= 1;?????????????? // D[0..7] <=> A[1..8] in AD-muxed mode
pPortAddr = (DWORD*)((DWORD)hMmMap + dwPortOffset);
dwValue = *pPortAddr;
// the high-byte of data is at value[23..16]
return (WORD)(((dwValue >> 8) & 0xFF00) | (dwValue & 0xFF));
}
// Function: write a word to a port on ISA bus
// Input: hMmMap: Base address of the ISA Port
// dwPortOffset = 0, 2, 4, .. 254, address of port on ISA
// wValue = the word data to be written
void ISAWrite16(HANDLE hMmMap, DWORD dwPortOffset, WORD wValue)
{
DWORD *pPortAddr;
DWORD dwValue;
dwPortOffset &= 0xFE; // 2-byte alignment
dwPortOffset <<= 1;?????????????? // D[0..7] <=> A[1..8] in AD-muxed mode
pPortAddr = (DWORD*)((DWORD)hMmMap + dwPortOffset);
dwValue = wValue;
// dispatch high-byte of data to value[23..16]
*pPortAddr = ((dwValue << 8) & 0x00ff0000) | (dwValue & 0x000000ff);
}


我們在ESM3352上,分別測試了利用地址映射方法直接訪問ISA外設地址和調(diào)用設備驅(qū)動API函數(shù)讀寫ISA地址,測得的結(jié)果是當進行字(WORD)讀寫時,應用程序直接訪問ISA外設地址比調(diào)用設備驅(qū)動API函數(shù)快10倍以上,當時行字節(jié)(BYTE)讀寫時,應用程序直接訪問ISA外設地址比調(diào)用設備驅(qū)動API函數(shù)快15倍以上。

下面是測試程序源代碼:

int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hISA, hMmMap;
BYTE ucValue;
WORD wValue;
DWORD dwStartTick, dwEndTick, i, k, cnt=2000;
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);
hMmMap = ISAMmMap(hISA);
if(hMmMap == NULL)
return -1;
printf("ISA read/write speed test\r\n");
printf("Memory Map VS Device Driver API\r\n");
dwStartTick = GetTickCount();
for(i=0; i for(k=0; k<256; k++)
{
ISAWrite8(hMmMap, k, 0x55);
ucValue = ISARead8(hMmMap, k);
}
dwEndTick = GetTickCount();
printf("1. Memory map BYTE read/write %d KBytes, Take time:%d ms\r\n", 256 * 2 *cnt / 1024, dwEndTick - dwStartTick);
dwStartTick = GetTickCount();
for(i=0; i for(k=0; k<256; k++)
{
ISA_WriteUchar( hISA, k, 0x55 );
ISA_ReadUchar( hISA, k, &ucValue );
}
dwEndTick = GetTickCount();
printf("2. Device driver API BYTE read/write %d KBytes, Take time:%d ms\r\n", 256 * 2 * cnt/ 1024, dwEndTick - dwStartTick);
cnt /= 2;
dwStartTick = GetTickCount();
for(i=0; i for(k=0; k<256; k++)
{
ISAWrite16(hMmMap, k, 0x55AA);
wValue = ISARead16(hMmMap, k);
}
dwEndTick = GetTickCount();
printf("3. Memory map WORD read/write %d KBytes, Take time:%d ms\r\n", 256 * 4 * cnt / 1024, dwEndTick - dwStartTick);
dwStartTick = GetTickCount();
for(i=0; i for(k=0; k<256; k++)
{
ISA_WriteWord( hISA, k, 0x55AA );
ISA_ReadWord( hISA, k, &wValue );
}
dwEndTick = GetTickCount();
printf("4. Device driver API WORD read/write %d KBytes, Take time:%d ms\r\n", 256 * 4 * cnt / 1024, dwEndTick - dwStartTick);
CloseHandle(hISA);
return 0;
}



下面是在ESM3352上兩種訪問方式的測試結(jié)果:

要實現(xiàn)應用程序直接訪問ISA外設地址空間需要更新ISA驅(qū)動程序,需要的用戶可與英創(chuàng)聯(lián)系。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • ISA
    ISA
    +關(guān)注

    關(guān)注

    0

    文章

    56

    瀏覽量

    44115
  • 嵌入式主板
    +關(guān)注

    關(guān)注

    7

    文章

    6102

    瀏覽量

    36308
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    ISA(PC/104)總線信號時序簡介

    ISA(PC/104)總線信號時序簡介 1.0 ISA概況2.0 ISA文獻2.1 ISA規(guī)范2.2 I
    發(fā)表于 05-25 01:13

    單片機P口接PCI/ISA數(shù)據(jù)總線

    RT當我單片機P口直接連接PCI/ISA數(shù)據(jù)總線的時候計算機啟動時會不會出現(xiàn)數(shù)據(jù)總線占線情況而啟動不了還是為了保險起見中間接244另:STM8單片/51單片機上電時端口默認是輸入還是輸
    發(fā)表于 08-01 11:09

    EM335x主板ISA總線的高級應用

    一次API調(diào)用對一個地址端口讀寫多個數(shù)據(jù)的操作。數(shù)據(jù)塊讀寫能有效提高數(shù)據(jù)讀寫的效率,在數(shù)據(jù)采集傳輸中有廣泛的應用?! ∫獙?b class='flag-5'>ISA總線進行讀寫,首先需要打開設備文件“ISA1:”如下: 
    發(fā)表于 07-11 11:04

    PCI9052總線接口芯片及其ISA模式應用

    或I/O映射可直接使PCI總線ISA總線相連,從而將ISA總線快速地轉(zhuǎn)換到PCI
    發(fā)表于 12-17 11:23

    ISA總線信號時序簡介

    ISA總線信號時序簡介:1.0 ISA概況2.0 ISA文獻2.1 ISA規(guī)范2.2 ISA書籍
    發(fā)表于 05-21 11:06 ?242次下載

    ISA總線引腳定義

    ISA總線引腳定義 ISA 是 Industry Standard Architecture 的縮寫
    發(fā)表于 11-23 18:46 ?5228次閱讀
    <b class='flag-5'>ISA</b><b class='flag-5'>總線</b>引腳定義

    ISA總線接口定義

    ISA總線接口定義     為16位系統(tǒng)總線,ISA槽有98個腳,數(shù)據(jù)線有16條,地址線有27條,其余為控制信號線,接地線,電源線和時鐘。其工作頻率為
    發(fā)表于 05-31 14:17 ?6453次閱讀

    ISA總線原理

    ISA總線的原理 ISA總線概況   ISA總線來源于IBM-PC微計
    發(fā)表于 12-09 11:22 ?9269次閱讀
    <b class='flag-5'>ISA</b><b class='flag-5'>總線</b>原理

    ISA插槽,什么是ISA插槽,ISA插槽外形圖

    ISA插槽,什么是ISA插槽,ISA插槽外形圖 ISA插槽是基于ISA總線(Industria
    發(fā)表于 04-26 18:12 ?7678次閱讀

    PCI9052總線接口芯片及其ISA模式應用

    PCI9052總線接口芯片及其ISA模式應用 PCI9052是PLX公司開發(fā)的服從PCI協(xié)議的從模式接口芯片,它能夠?qū)崿F(xiàn)ISA總線到PCI總線
    發(fā)表于 05-04 21:48 ?2148次閱讀
    PCI9052<b class='flag-5'>總線</b>接口芯片及其<b class='flag-5'>ISA</b>模式應用

    ISA總線和Futurebus+總線

    ISA總線和Futurebus+總線 ISA總線1. ISA
    發(fā)表于 05-21 11:15 ?3081次閱讀
    <b class='flag-5'>ISA</b><b class='flag-5'>總線</b>和Futurebus+<b class='flag-5'>總線</b>

    基于ISA總線的高速同步數(shù)據(jù)采集系統(tǒng)設計

      一種基于ISA總線的高速同步數(shù)據(jù)采集擴展卡,討論了經(jīng)合理的邏輯控制以協(xié)調(diào)高速A/D轉(zhuǎn)換與快速存儲操作的總線接口技術(shù),以及用極少的PC機I/O口地址資源實現(xiàn)數(shù)據(jù)的
    發(fā)表于 06-06 09:53 ?1774次閱讀

    基于ISA總線的同步通信控制器

    基于ISA總線的同步通信控制器
    發(fā)表于 02-07 18:09 ?10次下載

    英創(chuàng)信息技術(shù)精簡ISA總線Linux編程–Part1

    精簡ISA總線接口是一種8-bit寬度的雙向并行擴展總線,其特點是地址數(shù)據(jù)分時復用8-bit總線,加上4條總線控制信號,即可實現(xiàn)對外部數(shù)據(jù)的
    的頭像 發(fā)表于 02-07 11:19 ?1418次閱讀
    英創(chuàng)信息技術(shù)精簡<b class='flag-5'>ISA</b><b class='flag-5'>總線</b>Linux編程–Part1

    英創(chuàng)信息技術(shù)精簡ISA總線WinCE編程簡介

    據(jù)線加上4條總線控制信號,即可實現(xiàn)對外部數(shù)據(jù)的快速讀寫,異步訪問的最高速率在5MB/s左右。同步訪問需要再使能一條總線時鐘信號(共13條信號
    的頭像 發(fā)表于 02-11 16:55 ?1568次閱讀
    英創(chuàng)信息技術(shù)精簡<b class='flag-5'>ISA</b><b class='flag-5'>總線</b>WinCE編程簡介