女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

3天內不再提示

如何快速訪問ISA總線端口

英創信息技術 ? 作者:英創信息技術 ? 2019-09-26 10:35 ? 次閱讀

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

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

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


下面是上述5個函數實現的源代碼,在ISAMmMap函數中調用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, // 不使用輸入參數
&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外設地址和調用設備驅動API函數讀寫ISA地址,測得的結果是當進行字(WORD)讀寫時,應用程序直接訪問ISA外設地址比調用設備驅動API函數快10倍以上,當時行字節(BYTE)讀寫時,應用程序直接訪問ISA外設地址比調用設備驅動API函數快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上兩種訪問方式的測試結果:

要實現應用程序直接訪問ISA外設地址空間需要更新ISA驅動程序,需要的用戶可與英創聯系。

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

    關注

    0

    文章

    56

    瀏覽量

    44008
  • 嵌入式主板
    +關注

    關注

    7

    文章

    6096

    瀏覽量

    36135
收藏 人收藏

    評論

    相關推薦
    熱點推薦

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

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

    單片機P口接PCI/ISA數據總線

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

    EM335x主板ISA總線的高級應用

    一次API調用對一個地址端口讀寫多個數據的操作。數據塊讀寫能有效提高數據讀寫的效率,在數據采集傳輸中有廣泛的應用。  要對ISA總線進行讀寫,首先需要打開設備文件“ISA1:”如下: 
    發表于 07-11 11:04

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

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

    ISA總線信號時序簡介

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

    ISA總線引腳定義

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

    ISA總線接口定義

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

    ISA總線原理

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

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

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

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

    PCI9052總線接口芯片及其ISA模式應用 PCI9052是PLX公司開發的服從PCI協議的從模式接口芯片,它能夠實現ISA總線到PCI總線
    發表于 05-04 21:48 ?2086次閱讀
    PCI9052<b class='flag-5'>總線</b>接口芯片及其<b class='flag-5'>ISA</b>模式應用

    ISA總線和Futurebus+總線

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

    基于ISA總線的高速同步數據采集系統設計

      一種基于ISA總線的高速同步數據采集擴展卡,討論了經合理的邏輯控制以協調高速A/D轉換與快速存儲操作的總線接口技術,以及用極少的PC機I/O口地址資源實現數據的
    發表于 06-06 09:53 ?1725次閱讀

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

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

    英創信息技術精簡ISA總線Linux編程–Part1

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

    英創信息技術精簡ISA總線WinCE編程簡介

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