《VxWorks实时操作系统的USB驱动程序原理与分析.pdf》由会员分享,可在线阅读,更多相关《VxWorks实时操作系统的USB驱动程序原理与分析.pdf(4页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、!#$!计算机工程与应用%问题的提出通用串行总线(&()作为一种中高速的数据方式,已经很普遍地应用于外设与主机的通信中。)*+,-./是当今十分流行的实时操作系统,在通信、国防、工业控制、医疗设备等嵌入式实时应用领域。很多)*+,-./系统中都有&(设备,可是关于&(的驱动实现并没有相关的资料可以参考,给实际工作带来了难题。论文通过详细地分析)*+,-./下的&(驱动栈,具体提出了其实际应用的方法,为&(在应用)*+,-./的嵌入式系统的开发扫清了技术障碍。!)*+,-./简介)*+,-./是+0123045-公司开发的具有工业领导地位的高性能实时操作系统(3567 809:;5-60,1=/
2、%?)(%)可裁剪微内核结构。(!)高效的任务管理:!多任务,具有!A个优先级。具有优先级排队和循环调度。#快速的、确定性的上下文切换。(#)灵活的任务间通讯:!三种信号灯:二进制、计数、有优先级继承特性的互斥信号灯。消息队列。#套接字(,B.5)。$共享内存。%信号(0C167/)!#$%&实时操作系统的()*驱动程序原理与分析朱泽诚%王兴元!李洁#%(上海六合路DE号港陆黄浦中心%F层,上海!%)!(大连理工大学信息学院,大连%A%)#(东北大学信息学院生物医学工程实验室,沈阳%F)GH9607:I6J0-2K/016$B,9摘要)*+,-./是一种由+0123045-公司开发的先进的实时
3、操作系统,广泛地应用于各种嵌入式实时应用领域。论文是作者实践的结果。首先在简单介绍了)*+,-./这种先进的实时操作系统后,具体地分析了)*+,-./下的&(驱动程序模型的结构以及功能,详细地说明了其&(L驱动栈。同时,按照&(事件的调用过程,列出了相关的操作函数,并给出了其相应的调用方法。论文侧重于分析&(协议栈的内核,在此基础上完全可以实现一个稳定的&(驱动程序。关键词)*+,-./实时操作系统驱动程序通用串行总线文章编号%!HE#%H(!#)!H%!HF文献标识码M中图分类号8N#%A$!+,-./,/01$2()*3%45/%$0!#$%&6/7.84,/9-/%714$0):1/,;
4、/0?#70?A40?:=70BC4 D4/E%(O,$DE P0Q R5 3,62S R6-J,Q-301C RQ61C;Q T51-5,I61CI60!%U!(BI,7,V W1V,-960,1 B051B5 612 G1C0155-01C,L67061&1045-/0=,V 85BI1,7,C=,(XG W1/0Q5,L67061%A%U#(BI,7,V W1V,-960,1 B051B5 612 G1C0155-01C,O,-I56/5-1&1045-/0=,(XG W1/0Q1:)*+,-./0/61 62461B52 3567 8095:;5-60,1=/59 25457,;52
5、J=+0123045-B,9;61=,612 0/;,;Q76-01961=59J5252/=/59/$8I0/6-0B75 0/Y-051 J6/52,1 6QI,-Z/Y,-.$MV5-01-,2QB01C)*+,-./,8I0/;6;5-6167=/5/I5/-QBQ-5 612 VQ1B0,1,V&(2-045-9,2Q75,1 612 5*;7601 I5&(L 2-045-/6B.$M12 67/,70/I5 B,-576045,;5-60,1 VQ1B0,1/612 I5 Y6=,V B67701C I59 6BB,-201C,I5&(5451$,77,Y01C I0/6-0B7
6、5=,Q B61 V010/I 6/562=&(2-045-$H/:I$%&:)*+,-./,3567 8095:;5-60,1=/59,2-045-,&(基金项目:国家自然科学基金(批准号:ADDFE);中国博士后科学基金;辽宁省自然科学基金(批准号:D!%DF)资助项目作者简介:朱泽诚(%DAH),男,东北大学硕士生,研究方向基于嵌入式开发系统的网络安全设备以及生物技术与现代通信安全理论相结合的理论研究。%!计算机工程与应用!#$!(%)微秒级的中断处理。(&)支持()*+,#$,-实时扩展标准。(.)支持多种物理介质及标准的、完整的/01*网络协议。(2)灵活的引导方式。支持从3(4、5
7、6789、本地盘(软盘或硬盘)或网络引导。(:)支持多处理器并行处理。(;)快速灵活的*1(系统。(,)支持4)=()和3/,文件系统。(,)支持本地盘,56789,0=?)*0标准。(,#)多个系统调用。#)A驱动程序的结构概述图,提供了一个)A主驱动栈结构的简单概括。图!显示了)A主驱动栈的各模块之间的功能联系。(参见文献B!C)图,)A主驱动栈结构简单模型图!)A主驱动栈各模块之间的功能联系在栈的最底部是)A主控制器()A D0,即)A DE8F0EGFHE66IH),这是主系统中控制每一个)A设备的硬件部分。目前,市场上主要有两大类)A主控制器(参见文献B#C),一种是支持由JGFI6
8、公司最先提出的通用主控制器接口(GJKIH876DE8F 0EGFHE66IH*GFIH57LI,简称D0*),另一种是支持由微软、康柏和国家半导体公司联合设计提出的开放主控制器接口((MIG DE8F 0EGFHE66IH*GFIH57LI,简称(D0*)。硬件厂商一般根据这两个规范设计他们的)A主控制器。对于每一类型的主控制器都有一个与硬件独立的)A主控制器驱动(DE8F 0EGFHE66IH=HJKIH,简称D0=)。NJGO3JKIH提供 了 两 个 驱 动:P8-DLO9LJQJ-(D0*主 控 制 器 库)和P8-DLO(9LJQJ-((D0*主控制器库)。)A主驱动()A 9E8
9、FOHJKIH,简称)A=)和D0=之间的接口允许一个或超过一个的底层主控制器。而且,NJGO3JKIH的)A=能够同时连接多个)A D0=。这样的设计特点可以使开发者建立复杂的)A系统。)A=是在D0=之上的与硬件独立的模块。)A=管理每一个与主机相连的)A设备,向更高层次提供了可与)A设备通信的路径。它还负责自动处理)A电力管理以及)A带宽管理。而且,)A=还管理)A 9P-,DP-功能是一个驱动能否对)A正确操作的评价之一。因此NJGO3JKIH的)A=设计者要使)A=透明地处理9P-的功能。这意味着,)A=还能处理)A 9P-和设备的动态插拔。)A 06JIGF模块在)A主驱动栈的顶端
10、。)A类驱动()A 06788=HJKIH)是06JIGF模块的典型例子。)A类驱动负责管理连接到)A上的不同类型的设备;它们依靠)A=来提供与每个设备的通信路径。)A L6JIGF模块的其他例子就是那些利用)A=与)A设备通信的应用程序。%)A=驱动详解这一部分将要描述)A=()A DE8F=HJKIH)的典型应用。例如初始化,L6JIGF注册,动态连接注册,设备配置,数据传输,同时还探讨了)A=内部设计的关键特性。这部分是RSNEHT8下)A驱动的核心。%$,初始化)A=:分为两步(,)必须至少调用一次函数P8-O*GJFJ76JUI()。在一个给定的系统中,P8-O*GJFJ76JUI(
11、)初始化内部)A=数据结构,并依次调用其它)A驱动栈模块的入口。P8-O*GJFJ76JUI()可以在启动时调用一次,也可以对每一个设备各调用一次。)A=自己记录了调用P8-O*GJFJ76JUI()(V)和P8-O)9PF=EWG()(FF7L9()函数来把至少一个D0=连接到)A=上。这一过程既可以在RSNEHT8启动时,也可以在运行时把D0=连接到)A=上去。后一种机制可以支持“热插拔”,而不用象前一种那样需要重新启动。%$!D0=的连接(7FF7L9JGX)与断开(OIF7L9JGX)当D0=连接到)A=时,调用者为P8-ODLO7FF7L9函数传递D0=执行入口(表D0=YZ+Z0Y
12、?0)和D0=连接参数(D0=7FF7L9 M7H7IFIH)。)A=用D0=Y?0Y/0D服务请求依次激活D0=的执行入口,传递同样的D0=7FF7L9参数。,!#!#$!计算机工程与应用需要强调虽然可以改变用%&定义的参数,但是最好不应该有所改变。对于()*+,)-./提供的0%&1和2%&1的%&,%&1 344356参数是一个指向结构7&18&9:8%;*?43*4?$6)的指针。该结构用0%&1和2%&1主控制器的7&1配置头来初始化,而%&用这个结构中的信息来定位,管理特定的主控制器。典型的,调用者用?A75)&B3?9)*+()和?A75)&*C)D%.3+./:.4()来得到想
13、要的主控制器的7&1配置头这 两 个 函 数 定 义 在?A75)E)A中(?4A0?A3/5675)E)A$6中)。如果有0%&1或2%&1要连接到0FG,就要调用这些函数来获得每一个主控制器的7&18&9:8%;,。然后利用?A+%5+*C)D%.3+./:.4():读0FG主控制器配置头;+$?A+%5+4&+.里调用:3$0FG 5B3?+/)-./初始化入口点;A$0FG 5B3?+/)-./调用?A+1*)4)3B)I.();%4KFL3=5+.调用:5$%4KFL3=鉴别0FG主控制器的连接或断开;+$0?A+1*)4)3B)I.();.$0?A+75)&*C)D%.3+./:.
14、4():读0FG主控制器配置头;C$0?A+%5+/O?任务名:40?A+G?。虽然%&委托0FG来管理,但有可能%&亲自监视主控制器事件。例如()*+,)-./提供了0%&1和2%&1的%&来创造这样的任务。对于()*+,)-./的0%&1模块(?A%5+06P5)E)A),后台任务只是被周期地唤醒,目的是为了检查超时1,7(用一个中断来通知2%&1根6A发生改变)。用以在0FG和0FG之间进行通信的5B).*4模块,除了调用?A+1*)4)3B)I.()外,必须调用?A&B).*4,.D)?4./()使其在0FPG注册。当一个5B).*4注册到0FG时,0FG把每一个以后将要用到的5B).
15、*4的数据结构定位,并跟踪那个5B).*4的请求。对于每一个5B).*4,在5B).*4注册过程中,0FG还创建了一个53BBA35O任务。在成功注册5B).*4后,0FG返回一个句柄0FPG8&E1;QR8%/O?任务优先级。这确保了每一个53BBA35O按其5B).*4的任务优先级来执行,而且可以利用优先级来写5B).*4,保证对时间要求严格的0FG传输。由于每一个5B).*4有它自己的53BBA35O任务,因此在53BBA35O期间,它们有很大的灵活性决定可以做什么。例如,允许在不破坏0FG或其它0FG 5B).*4性能的条件下,使53BBA35O执行代码运行至阻塞态。&B).*4 53
16、BBA35O 43?O有MN(/O?任务名:40?A+&B*。H$V0FG内部&B).*4当第一次初始化0FG时,由0FG产生并注册一个内部5B).*4,以跟踪0FG请求。0FG可以产生什么类型的0FG请求呢?所有0FG与0FG设备的传输,均利用调用0FG 5B).*4的形式来完成。例如,当一个设备第一次连接到系统时,0FG用一个控制管道(5*4/B=)=.,参见文献W#X)自动地创建设备需要的所有的5*4/B=)=.,即0FG 5B).*4要用?A+7)=.&/.34.()来创建一个与0FG.*+=)*4通话的通道,然后所有0FG内部、外部5B).*4通过这个管道来发送诸如?A+.?5/)=
17、4/:.4()或?A+P9.34/.:.4()等的函数,进行操作。所以,0FG的一个机制就是0FG循环利用它自己的.*4/Y=)*4,而内部5B).*4跟踪这些请求。H$Z动态连接的注册每当一个特定类型的设备插入或拔出时,0FG 5B).*4都J!H计算机工程与应用!#$!通知上一层。利用调用%&()*+,-./011,/2345.&146()操作,/7.4+1可以指定一个/,77,/8操作,以便可以获取这样的通知。9:;设备类型用/7,&,&%/7,&,?0:AAAA。:%/7,&和6=1=/=7根据/7,&来定义,因此这些常数根据特定的/7,&在头文件中 定 义。有时,一 个/7.4+1当
18、利用%&()*+,-./01B1,/2345.&146()进行注册时,只对特定的/7,&,&%/7,&,:9;B?0:CE);GGH,I3GHG?GCE);GGHJKL;G03)。通过/,77,/8机制的响应,每当一个设备完全符合这样的标准,从设备上插入或拔出时,9:;)便通知给84*B=,6(/7,&(6.D46。而在其它情况下,/7.4+1关注的范围更广泛了。常量9:;)MGHENL(定义在%&(.$2)可以替代任意的/7,&,&%/7,&,?0:I3EMHK3,&%/7,&等 于9:;:9;?0:I3EMHK3(%&I6.+146$2),MGHENL0。典型的,当一个/7.4+1只调用一
19、次%&()*B+,-./011,/2345.&146()时,对一个/7.4+1能拥有的并发通知请求数目没有限制。O$PM=(4 E)9:;设备一般用9:;)MG)KE)来区别。从其作用来看,9:;)MG)KE)是9:;)用来跟踪一个设备的句柄。它与9:;设备真正的9:;地址无关。这表明/7.4+1并不真正关心想要了解设备是物理上与哪一个9:;主控制器相连。应用为每个设备抽象定义的M=(4 E),使/7.4+1可以不用考虑物理设备的连接细节以及9:;地址分配,并允许9:;)在其内部对这些进行详细的管理。当一个/7.4+1通知有一个设备连接或断开时,9:;)经常通过9:;)MG)KE)来定位设备。
20、同样,当一个/7.4+1想通过9:;)与一个特定的设备通信时,它必须向9:;)传递那个设备的9:;)MG)KE)。O$Q总线编号(%&4+%-46,1.=+)操作%&(.模块提供了%&(;%&?=%+1R41(),%&(3=1M=(4E(BR41(),%&(C%I=61?=%+1R41(),%&(M=(4E(R41()操作。它们被一起称作总线编号操作。它们使9:;)?7.4+1对连接到每一个主控制器上的设备进行编号。这些操作对于诊断程序和测试工具很有用,例如%&H=7(S.+(3.D46提供的一个测试工具)。但是,利用它们编号之后,调用者无法知道9:;的拓扑结构是否变化。因此,建议9:;/7,
21、&(6.D46的开发者不要用这些操作。O$T数据传输一旦/7.4+1配置完成一个设备,就开始利用9:;)提供的管道和传输功能与设备进行数据交换。传输种类(分为控制、块、中断和同步传输,参见文献U#VUOV)用一个9:;E3I数据结构来描述。9:;E3I的具体描述请参见C?)N9M?E3I:9;WEH。9:;数据传输被定位于每一个设备的特定4+(=.+1。在9:;)/7.4+1和特定的设备4+(=.+1之间的通道被称作管道(.MG)KE);设备的4+(IEIKC0M)K,它被用于随后对这个管道的所有/7.4+1操作。当/7.4+1企图创建一个管道时,9:;)会检查是否有足够的可用带宽。对于中断和
22、同步传输,带宽限制是必需的。9:;)不允许把QX以上的可用带宽分配给中断和同步管道;而对于控制和块传输,则没有带宽的限制。同时,保证至少TX的带宽用于控制传输,对块传输则不保证会提供任何可用带宽。数据传输的具体过程:(T)创建.4:%&(I.4?64,14(%&(?7.4+1 C,+(74,+=(4E(,4+(AN3HLIK;9J,9:;)E3G9H,-,YI,/841:.Z4,=%1I.4C,+(74);(!)定义/,77,/8:=%676?,77,/8(D=.(I);(#)初始化E3I的数据结构;(O)发送E3I:%&(H6,+&F46(%&(?7.4+1C,+(74,=%1I.4C,+B
23、(74,.6)。小结9:;在DY6=8&下的从下至上驱动栈分为C?、9?)、9:B;)和?7.4+1 W=(%74四层,每一层都相对独立,并为上一层提供了屏蔽该层次具体特征的接口。作者所说的9:;驱动,实际上主要在9:;)这一层次上完成。具体分为?7.4+1注册,注销,创建.4,配置,数据发送,以及各回调函数。当正确地依次调用时,会根据回调函数的状态和返回值,按正确的时序进行完整的数据传输。上述设计思想构成了YS=68&下9:;设备应用的基础。作者的研究详细地分析了YS=68&的9:;协议栈,证明了该方案的可行性,同时又给出了合理的实现方法。作为实践成果,作者已在IM网关证书读取系统中,利用该
24、思想编写的驱动,顺利读出存储在9:;设备中的设备证书和管理员证书,且运行情况良好。作者认为,文中提到的模型完全可以胜任解决9:;设备在YS=68&下的应用所面临的技术难题。(收稿日期:!年TT月)参考文献T$孔祥营,柏桂枝$嵌入式实时操作系统YS=68&及其开发环境H=6+,_(=UWV$北京:中国电力出版社,!T_TT!$9:;(4D47=46&8.1%&46&5%.(4,+(6474,&4+=14&UWV$9:0:S.+(3.D46?=-,+*,TQQP#$埃科尔逊$9:;大全UWV$北京:中国电力出版社,!T_O$?26.&?,+1$S6.1.+5.+(=&S)W(4D./4(6.D46&UWV$:,+N6,+/.&/=:3)aW.7746 N644-,+E+/,TQQQ$毛德操,胡希明$.+%Y内核源代码情景分析UWV$杭州:浙江大学出版社,!T_QT!