版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、vb环境下实现pci设备底层访问的两种方法介绍了在vb开发环境下,对pci设备举行底层拜访的两种办法:一种是通过用用户自己编写的动态衔接库(dll)实现,二是利用windriver提供的vb运行库编写挺直拜访硬件接口函数,并对两种办法行了比较。vb集成化编程语言一种功能强大而简单上手的开发工具,在用户界面、数据库、多媒体、网络编程等方面,vb可谓得心应手。然而vb有限的硬件编程能力以又使得许多硬件开发者对此深感无奈。尤其在工业控制,测控技术等领域,自行设计开发的io卡,数据采集卡等在win32下的驱动经常需要借助ddk,vtooisd等工具举行艰苦而又长久的内核模式开发。本文介绍了在vb开发环
2、境下拜访pci设备的办法。对于其他设备,办法与此大同小异。在vb开发环境下,用户要拜访诸如数据采集卡之类硬件上的pci设备,普通来说有两种途径:一是挺直拜访,即用vb挺直编写拜访pci设备的接口函数(这种办法要有相关软件的支持);二是间接拜访,即vb调用其它编程语言(如汇编,cc等)写的底层驱动模块(普通封装成动态衔接库dll的形式)实现。1 pci的配置空间pci规范定义了三种地址空间,除了存储器和io地址空间外,为支持pci设备系统资源的自动配置,还定义了配置地址空羊。pci总线的配置空间由256个字节组成,分为预定首区和设备关联区。预定首区包括开头64个字节,对全部的pci设备来说,都必
3、需支持该区的设置;设备关联区的寄存器有不同的的pci设备厂家自己定义。配置空间的预定的首区别两个部分,前16个字节的定义对各类pci设备而言都是相同的,后48个字节空间按照设备支持的功能有不同的分配。首区类型定义了该空间的分配状况(目前惟独一种类型00h)。表1是首区的组织结构。全部的pci设备必需支持首区的供给商id、设备id、命令和状态区。对于其他寄存器的用法可按照设备的楞能来挑选。对于不同的pci设备,其供给商id由pcisig分配以确保唯一性,而设备id则由供给商自己分配。2 pci设备的配置过程pci总线的配置空间规范保证了全部pci设备对“即插即用”的支持。系统在上电后,“即插即用
4、”bios通过隔离算法读取每一个“即插即用”设备的资源申请数据,并分配相应的系统资源,同时检查资源的矛盾状况,然后引导、加载操作系统,并将控制权交给操作系统;假如加载的是“即插即用”操作系统(windows95及以后版本),那么操作系统将接管系统的资源管理权,它首先从bios读取“即插即用”设备的资源配置信息,并仲载资源矛盾状况,然后配置bios尚未配置的“即插即用”设备,将设备的配置信息写入配置管理器,最后激活无资源矛盾的“即插即用”设备,装载相应的设备驱动程序。对于pci设备来说,系统完成引导之后,除了将资源的分配写入系统的配置管理器外,还写入了相应的pci配置寄存器。程序可以通过挺直读取
5、设备的配置寄存器来得到设备的io,存储器等资源配置状况。3 vb下pci设备的拜访驱动程序拜访pci设备的过程普通包括扫描pci总线,相找指定的pci设备,确定io等资源分配状况,举行io、存储器、中断以及dma等操作。vb本身并不能实现上述对pci设备的拜访过程,下面介绍在vb下通过其他途径实现对pci设备的拜访。31 vb挺直拜访windriver为vb只提供了十分有限的io拜访能务(如串口通信),在vb下挺直拜访pci设备时需要借助其它软件。目前windriver是keftech公司主推产品,是许多pci厂家所推举的首选驱动器程序开发工具。windriver为vb 4.0以上版本提供了一
6、个类模块(windriver.cls),利用这个类模块,用户可以手工编写自己需的接口函数来拜访相应的设备。下面以详细例子来解释windriver.cls的用法办法。3.1.1 扫描pci总线得到指设备的数目利用windriver.cls提供的应用程序接口函数(apis),编写一个扫描pci总线,获得指定pci设备数目的函数下:function getcardsnum (dwvendorid as)long, dwdeviceid as long) as integerdim pciscan as wd_pci_scan_cardsdim hwd as longhwd = wd_open()if
7、 hwd =invalid_handle_value thenmsgbox 设备打开出错exit functionend ifpciscan.searchid.dwvendorid =dwvendoridpciscan .searchid.dwdeviceid =dwdeviceidwd_pciscancards hwd, pciscanwd_close (hwd)getcardsnum = pciscan.dwcardsend function该函数可以通过输入参数:pci设备的供给商id和设备id得到所需的pci设备数目。如查找amcc公司的pci适配芯片s5933,则输入参数为:&h10
8、e8和&h4750。下面例子用于读写s5933的pci配置寄存器。在工程的全局模块中需要先定义下列数据结构,同时设备必需处于打开状态。type amccinnterruptint as wd_interrupththread as longtrans(o to 1)as wd_transferend typetype amcc_addr_descdwlocalbase as longdwmask as longdwbytes as longdsaddr as longdwaddrdirect as longflsmemory as booleanend typetype amcc_struct
9、hwd as longcardlock as wd_cardpcislot as wd_pci_slotcardreg as wd_card_registeraddrdesc(0 to ad_pci_bars1)asamcc_addr_descfuseint as booleanint as amcc_interruptend type3.1.2 读写pci配置寄存器完成以上数据结构的定义后,用下面的函数可写s5933的pci配置寄存器内容。function amcc_readpcireg (hamcc asamcc_setruct, dwreg as long)dim pcicnf as w
10、d_pci_config_dumpdim dwval as pvoidpcicnf.pcislot = hamcc.pcislotpcicnf.pbuffer = dwvalpcicnf.dwoffer = dwregpcicnf.dwbytes = 4pcicnf.flsread = truewd_pciconfigdump hamcc.hwd, pcicnfamcc_readpcireg = dwvalend function 读函数sub amcc_writepcireg (hamcc asamcc_struct, dwreg as long, dwdata as pvoid)dim p
11、cicnf as wd_pci_config_dumppcicnf.pcislot = hamcc.pcislotpcicnf.pbuffer = dwvalpcicnf.dwoffer = dwregpcicnf.dwbytes = 4pcicnf.flsread = falsewd_pciconfigdump hamcc.hwd, pcicnfend sub 写过程参数解释:hamcc 设备打开后系统分配的句柄dwreg 读写的pci配置寄存器dwval 读出的寄存器数据dwdata 写入寄存器的数据以上例子仅仅是抛砖引玉。windrar.cls类模块提供了功能极为强大的底层驱动的api函
12、数,用户通过编写相应的驱动模块可以便利地实现对各类硬件的io、存储器映射、中断以及dma等操作,同时可以实现win32下物理内存空间的申请、读写等处理。另外对于实时性要求较高的设备,windriver提供的“内插”(plug-in)特性可以让程序的相关模块运行于ring 0内核模式(kernel mode),以提高性能。开发完成的底层驱动模块既可挺直为vb的应用程序调用,也可以在vb下封装成dlls供其它的win32开发工具调用。32 自定义dll拜访dll使vb的功能得到极大的增加,使得vb的应用范围不断扩大,用法越发灵便。vb通过调用自定义dll可以实现对硬件的底层拜访。下面用例了解释vb
13、对dll的调用及dll的编写过程。321 dll的功能和编写本例中的dll通过扫描pci总线,得到总线上s5933接口芯片的数目,打开指定设备,向s5933的输入邮箱子中写入指令字,然后从输出邮箱1中读取返回数据,最后关闭设备。extern c _declspec (dllexport)int _stdcall getcardsnum()afx_manage_state (afxgetstaticmodulestate();int cards;cards=amcc_countcards (0x10e8,0x4750);return cards; /此函数得到s5933的数目;extern c
14、declspec (dllexport)dword_stdcall send-command(int cardnum, dword dwcmd)afx_manage_state (afxgetstaticmodulestate();dword data;if (amcc_open (&hamcc, 0x10e8,0x4750,card-num, 0) /打开指定设备amcc_writeregdword(hamcc, omb1_addr);dwcmd); /写入指令字dodata=amcc_readregdword(hamcc,mbff_addr);while(data&0x000f0000)=
15、0x00000000);/等待输入邮箱1满data=amcc_readregdword(hamcc,imb 1_addr);/读取返回数据if(hamcc) amcc_close(hamcc)/关闭设备return data;elseafxmessagebox(“打开设备失败!”);return 0;程序中用到的函数包含在windriver的api函数库中,在vc下编译时加上头文件:include amcclib.hinclude amcclib.c同时在def文件中列出dll的导出函数名,生成的dll即可为vb即可为vb所调用。读者也可用其它工具编写驱动模块,最后封装成dll即可。2.2.2
16、 vb调用dllvb调用动态衔接库(dll)时,首先声明dll,然后即可像调用vb的语句或函数一样用法dll中的例程。下面介绍vb调用上例生成的dll(假设文件名为test.dll)。声明public declare function getcardsnum libtest.dll()as integerpublic declare function sendcommand libtest.dll(byval dwcmd as long) as long在声明时需要注重:dll的路径;参数传递的方式;参数的类型。另外,vb遵从_stdcall的参数传递商定,而vc默认_cdecl的传递商定,因此在dll中的导出声明需采纳_stdcall的装点符。调用一旦声明后,在vb的应用程序中就可调用dll中的例程。如:private sub form_load()dim cardsnum as integercardsnum = getcardsnum()msgbox“系统中有”+ str(cardsnum)+“块s5933插卡!”end subwindriver包括了诸如amcc、plx、galileo、v3、plda等公司pci芯片的专用cc的api函数库,其中包含了io读写,内存映射,中断处理以及dma等底层驱动的函数,可以十分便利地用vc,bc以及c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 初中实词第04组:素、胜、徒、徙、颓、亡、微、比 (答案版)
- 汽车刹车种类介绍
- 夏令营产品介绍
- 2025年水利安全员C证考试模拟测试题及答案
- 围墙施工方案(围墙,施工方案)
- 自动万用表的使用方法
- 消防应急器材知识及使用考试试题及答案
- 食品生产企业风险评估
- 2025年小学生航空航天知识竞赛题库附答案
- 2025年诊断学心肺腹试题及答案
- 单位消防安全基本情况档案模板
- 医用耗材管理培训课件
- 蜜雪冰城供应链优势分析
- 学校预防传染病和食物中毒健康教育讲座
- 抗凝药物的使用和注意事项课件
- 有机朗肯循环中低温余热发电技术与工业余热利用课件
- 储能技术 习题答案汇总 (梅生伟)第1-9章
- 《儿童安全用药》课件
- 完整版新概念第一册笔记(张云生)word版
- 美术课堂教学的有效性研究 论文
- ATLAS无油压缩机原理及结构资料
评论
0/150
提交评论