在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    瀏覽量

    44010
  • 嵌入式主板
    +關注

    關注

    7

    文章

    6096

    瀏覽量

    36138
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    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 ?5183次閱讀
    <b class='flag-5'>ISA</b><b class='flag-5'>總線</b>引腳定義

    ISA總線接口定義

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

    ISA總線原理

    ISA總線的原理 ISA總線概況   ISA總線來源于IBM-PC微計
    發表于 12-09 11:22 ?9164次閱讀
    <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 ?2093次閱讀
    PCI9052<b class='flag-5'>總線</b>接口芯片及其<b class='flag-5'>ISA</b>模式應用

    ISA總線和Futurebus+總線

    ISA總線和Futurebus+總線 ISA總線1. ISA
    發表于 05-21 11:15 ?3023次閱讀
    <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 ?1726次閱讀

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

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

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

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

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

    據線加上4條總線控制信號,即可實現對外部數據的快速讀寫,異步訪問的最高速率在5MB/s左右。同步訪問需要再使能一條總線時鐘信號(共13條信號
    的頭像 發表于 02-11 16:55 ?1498次閱讀
    英創信息技術精簡<b class='flag-5'>ISA</b><b class='flag-5'>總線</b>WinCE編程簡介
    主站蜘蛛池模板: 日韩高清一级 | 久久色婷婷 | 四虎影午夜成年免费精品 | 免费边摸边吃奶边叫床视频gif | 成人夜色香网站在线观看 | 亚洲一区在线视频 | 六月丁香激情综合成人 | 华人黄网站大全 | 亚洲人成网站999久久久综合 | 欧美肥胖女人bbwbbw视频 | 美女和帅哥在床上玩的不可描述 | 国产女人又爽又大 | 99久久成人国产精品免费 | 四虎永久免费影院 | 色视频在线观看免费 | 亚洲色图.com | 手机在线精品视频 | 欧美网站色 | 日本一区二区三区欧美在线观看 | 大香伊在人线免费 | 午夜视频免费在线观看 | 亚洲免费成人 | 亚洲伊人网站 | 狠狠色噜噜狠狠狠狠黑人 | 午夜刺激爽爽视频免费观看 | 91久久福利国产成人精品 | 国产在线播放你懂的 | 老师叫我下面含着精子去上课 | 黄色大片网 | 国产一卡二卡3卡4卡四卡在线 | 色国产视频 | 高清不卡毛片免费观看 | 色综合色综合色综合色综合网 | 国产在线理论片免费播放 | 免费在线播放黄色 | 国产a三级三级三级 | 亚洲午夜久久久 | 最近2018中文字幕免费看手机 | 韩国三级hd中文字幕久久精品 | 久久久噜噜噜久久久 | 欧美满足你的丝袜高跟ol |