基于实时操作系统VxWorks的CAN驱动设计与实现_第1页
基于实时操作系统VxWorks的CAN驱动设计与实现_第2页
基于实时操作系统VxWorks的CAN驱动设计与实现_第3页
基于实时操作系统VxWorks的CAN驱动设计与实现_第4页
基于实时操作系统VxWorks的CAN驱动设计与实现_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、收稿日期:2005204218;修返日期:2005206214基金项目:国防预研资助项目(417010402基于实时操作系统Vx Wo rks 的CA N 驱动设计与实现3徐美荣,蔡铭,董金祥(浙江大学计算机科学与技术学院,浙江杭州310027摘要:设备驱动设计是嵌入式系统开发的难点。针对本系统可靠性和实时性要求严格的特点,在详细分析Vx Works 实时操作系统设备驱动机制的基础上,通过采用内核过程的方式实现了Vx Works 下CAN 设备驱动,达到了预期的目标。所给出的Vx Works 下设备驱动设计的一般步骤为Vx Works 其他设备驱动开发提供了参考。关键词:Vx Works;实时

2、操作系统;内核过程;设备驱动;CAN 总线中图法分类号:TP311111文献标识码:A 文章编号:100123695(20060520185204Design and I m p lementati on of CAN D river Based on Real 2Ti m e Operati on Syste m Vx WorksXU Mei 2r ong,C A IM ing,DONG J in 2xiang(College of Co m puter Science &Technology,Zhejiang U niversity,Hangzhou Zhejiang 310027

3、,China Abstract:Design of device 2driver is a difficult task in e mbedded 2syste m s devel op ing .Considering the de mand of reliabilityand near real 2ti m e of this syste m,the mechanis m of device 2driver based on RT OS of Vx Works is analyzed firstly,then the de 2vice 2driver of CAN bus is i m p

4、 le mented by using kernel 2p r ocess technique .Thr ough thismethod,expectant perfor mance of tar 2get syste m is achieved .The general p r ocess of device 2driver 2design used in this paper can be refered by others device 2driver 2devel op ing based on Vx Works .Key words:Vx Works;RT OS;Kernel 2Pr

5、 ocess;Device D river;CAN Bus1引言目前,嵌入式系统的开发越来越受到重视,嵌入式产品的应用越来越广泛。开发所采用的操作系统中,Vx Works 是比较受欢迎的一种。Vx Works 是由W indR iver 公司开发的具有工业领导地位的高性能实时操作系统(Real 2Ti m e Operati on Syste m,RT OS ,是一个具有可伸缩、可裁剪和高可靠性,同时适用于所有主流CP U 目标平台的实时操作系统。Vx Works 的微内核W ind 是一个具有较高性能的、标准的嵌入式实时操作系统内核。其主要特点包括快速多任务切换、抢占式任务调度、任务间通信手

6、段多样化等。在一个典型的Vx Works 嵌入式系统应用中,传送和接收少量的重要数据是必要的,这些数据必须在一个实时的时间内到达。这与非实时的网络不同,如在PCLAN 中传输一个文件。控制器局域网(C AN 是Bosch 公司在现代汽车技术中领先推出的一种多主机局域网,由于其卓越的性能、极高的可靠性、独特灵活的设计和低廉的价格,现已广泛应用于工业现场控制、智能大厦、小区安防、交通工具、医疗仪器、环境监控等众多领域。一般来说CAN 报文包允许传输最高八个字节的数据,而总线仲裁的方法保证了一个重要数据能够在一个保证的时间内到达1。目前,Vx Works 对现场总线通信支持的驱动还是不多,本文详细分

7、析了Vx Works 设备驱动机制,并通过CAN 驱动设计的实例给出了Vx Works 设备驱动设计的一般思路。2Vx Works 设备驱动分析Vx Works 操作系统有两种方式实现驱动:把设备驱动程序作为独立任务来实现,直接在顶层任务中实现硬件操作,完成特有的专用驱动程序。Vx Works 的I/O 系统将设备驱动程序作为内核过程实现,这种方式可以大大减少系统的开销,提高系统的可靠性和实时性。Vx Works 标准设备驱动是通过I/O 系统来存取的,这样做的好处是可以屏蔽底层硬件,对上层应用程序提供统一的接口。Vx Works 的I/O 系统有其独特的特性,使得它比其他I/O 系统更快速、

8、灵活,这在实时系统中非常重要。还有一些特殊的设备驱动,如网络设备驱动,由于其自身的特性,虽然不是通过标准I/O 来进行存取的,但是也都有它们各自相关的规范2。在这里只介绍通过I/O 系统存取的标准设备驱动机制。211与设备驱动关联的表在Vx Works 中,应用程序是通过打开命名文件来访问I/O 设备的。要理解Vx Works 设备驱动机制必须分清文件描述符表(F D _T ABLE 、设备链表(DE V I CE L I ST 和驱动表(DRV _T ABLE 三者的各自作用和关系3,如图1所示。(1文件描述符表(F D_T ABLE 。主要用来管理已经打开的文件。每一个打开的文件都会在F

9、D _T ABLE 中占用一个条目(F D_E NTRY 。随后对文件的操作,都由应用程序通过对文件在F D_T ABLE 中的索引fd 进行操作来实现。F D _T ABLE 中所包含的F D _E NTRY 的数量,也就是系统一次所能打开的最大文件数。F D_E NTRY 记录了与每一个已经打开的文件相关的信息,主要包括该文件所在设备的设备头指针pDevHdr,文件的名字na me,以及该条目是否可用的标志等信息。在这里最主要的是设备头指针pDevHdr,通过该指针,操作系统能够找到实际要操作的文件设备,并调用设备的驱动程序来真正地完成对设备的操作。(2设备链表(DE V I CE L I

10、 ST 是Vx Works 设备的双向链表。要编写驱动的设备也必须加入到该链表中。每一个设备数据结构的第一项必须是一个设备头DE V_HDR 数据结构,其余是与设备相关的数据,如操作设备所需的缓冲器和进行同步或互斥用的信号量等数据。DE V _HDR 数据结构记录了某一类设备的主要信息,包括驱动号(drv_nu m 和设备名na me,以及一个用于将所有的设备链接起来的DL _NODE 数据结构,也就是Vx Works 中的双向链表结构node 。通过node,系统中所有存在的设备链接成一个链表,操作系统能够遍历这个链表,从而知道所需的设备是否存在。驱动号drv_nu m 代表了驱动表(DRV

11、_T ABLE 中的第几个条目,这个条目里保存有该设备的实际操作函数指针。这样,通过drv_nu m,操作系统就可以最终调用设备的驱动程序。(3驱动表(DRV_T ABLE 。由驱动条目组成。它维护了系统内所有设备的驱动条目。驱动条目存放的是实际操作设备的驱动指针。在Vx Works 中,每一类设备的操作共分为七种类型,分别是生成、删除、打开、关闭、读、写和I octl 。Vx Works I/O 系统的初始化工作是由根任务usr Root 调用i osI nit 例程来完成的。其原型如下:ST AT US i osI nit (int max_drivers,int max_files,ch

12、ar 3null D ev Na me 其中,参数max_drivers 是允许的最多驱动数也是驱动条目的最大数量;max_files 是允许一次打开的最多文件数也是最大的文件条目数量;null D ev Na me 是空设备的名称。开始时,系统定义了一个空设备和一个空设备的写操作;然后例程分配文件描述表,并清空所有的文件条目;分配驱动表,并清空所有的驱动条目;初始化设备链表;接着例程把驱动表的第一条目设置为一个空设备写,将空设备挂入设备链表的第一个节点。至此已经完成I/O 系统的初始化工作,就形成如图1所示的结构。212设备访问过程Vx Works 为各种设备(包括字符设备、块设备、虚拟设备

13、及网络设备提供统一的访问接口。用户访问设备是通过应用程序界面(AP I 来实现的。I/O 系统所起的作用就是把用户请求分配到与设备对应的驱动例程中去。用户在操作I/O 设备之前,与设备对应的文件描述符必须被打开,这是通过调用open (或create (函数来完成的3。下面以某一个设备驱动程序为例,说明设备的访问过程(假设设备名为“/XX /0”,并且以XX 设备的驱动为例。(1调用open (“/XX /0”,O_RDWR,0644函数;(2I/O 系统遍历设备链表(DE V I CE L I ST ,寻找名字为“/XX /0”的设备项,并找到该设备相应的驱动号drv_num;(3I/O 系

14、统为设备文件在文件描述符表(F D _T ABLE 中分配一个空的文件条目(F D_E NTRY ;(4I/O 系统通过驱动号drv_nu m,在驱动表(DRV _T A 2BLE 中找到XX 设备的xx Open (xx_DE V pXX _DE V,char 3name,int flags 例程,该驱动例程返回设备描述符指针;(5如果打开成功,就将设备描述符指针、设备全文件名及驱动相关的返回值存放在新分配的文件条目里,并返回一个fd;如果设备打开失败,就将已经分配的文件条目释放;(6读、写等操作可以直接通过调用fd 找到设备驱动号,进而找到设备的驱动例程。213设备驱动设计过程通过分析知道

15、,设备驱动设计需以下的几个步骤3,4:(1设备数据结构的定义,其第一项必须是设备头DE V _HDR 结构;(2设备驱动例程编写,包括生成、删除、打开、关闭、读、写和I octl 例程;(3设备驱动注册,通过调用i os D rvI nstall (函数将自己的设备驱动注册到I/O 系统的驱动表(DRV_T ABLE 中;(4设备挂载,通过调用i os Dev Add (函数将设备挂载到I/O 系统的设备链表(DE V I CE L I ST 中,调用int Connect (函数完成中断服务程序的挂接,并用sysI ntEnableP I C (函数打开设备中断;(5把文件或函数按照BSP

16、的目录结构加到正确的位置;(6编写Makefile 文件,最后是编译调试工作。3基于Vx W o rks 的CAN 设备驱动实现311I SA 2CAN 适配卡的硬件结构I S A 2CAN 适配卡是I S A 接口的C AN 总线通信适配卡,其主要功能是让计算机方便地连接到CAN 总线上,实现CAN 210B 协议(兼容CAN 2.0A 的连接通信,CAN 的通信协议主要由C AN 控制器SJA1000完成,如图2所示 。适配卡使用系统内存地址映射空间方式,对于I ntel x86体系的CP U,I S A 可以映射的空间为0xC80000xEFFFF 。使用比较器和地址选择开关组成可选端口

17、地址译码电路,通过开关选通内存映射基地址(C8000H,C9000H,C A000H,EF000H ,以避免与其他器件冲突。适配卡中断I RQ 设置通过跳线进行选择,可选的I RQ有I RQ3,I RQ4,I RQ5,I RQ6,I RQ7, I RQ9,I RQ10,I RQ11,I RQ12和I RQ15。312CAN设备驱动主要实现技术31211主要数据结构(1协议帧数据结构typedef structunsigned l ong I D;/3报文I D3/unsigned char SendType;/3发送帧类型3/unsigned char Re moteFlag;/3是否是远程帧

18、3/unsigned char ExternFlag;/3是否是扩展帧3/unsigned char Data Len;/3数据长度(<=83/unsigned char Data8;/3报文的数据3/CAN_FRAME;(2缓冲器数据结构typedef structint pT oBuf;/3写入指针3/int pFr omBuf;/3读出指针3/int bufsize;/3缓冲器大小3/CAN_FRAME3buf;/3CAN数据帧指针3/CANR I N G;(3CAN设备描述符结构typedef structDEV_HDR pCANHDR;/3I/O系统设备头3/BOO creat

19、ed;/3TRUE如果设备已经创建3/CANR I N G_I D CanRdBuf;/3环状读缓冲器指针3/SE MAPHORE rdSyncSem;/3读同步信号量3/SE MAPHORE mutexSe m;/3互斥信号量3/CANR I N G_I D Can W rt B uf;/3环状写缓冲器指针3/SE MAPHORE wrtSyncSem;/3写同步信号量3/SEL_WAKEUP_L I ST sel W akeupL ist;/3等待设备的任务列表3/CAN_DEV;31212具体实现技术主要完成所需缓冲器的操作和设备基本驱动例程。驱动主要包括设备驱动初始化和设备创建、设备打

20、开、报文的收发和I/O控制、中断服务等。(1缓冲器操作CAN缓冲器CANR ing是一个先进先出的环缓冲器,设有读和写两个环缓冲器。创建时,比实际的要大一个数据帧空间。满时,读写指针始终相差1;只有当空时,读写指针相等。由于一个读任务和一个写任务是分别对读指针和写指针进行修改的,所以它们可以同时访问环缓冲器,这由其自身特点来保证,不需要额外的互斥操作。但对于多个读任务或者多个写任务同时访问缓冲器的情况下,需要互斥机制来保证,如用信号量机制。由于C AN协议是按一帧进行读写的,因此环缓冲器每项的大小也是按固定的一帧大小来创建的,使操作时变得简单。(2设备驱动初始化Can D rv(和设备创建Ca

21、n Dev Create(设备驱动初始化时,判断驱动是否已经初始化。如还没有初始化,则调用i os D rvI nstall(例程。该例程对于同一个设备驱动只需调用一次,它将驱动服务例程与I/O系统服务进行关联,将C AN驱动例程加入到驱动表DRV_T ABLE中,并且分配给CAN设备一个驱动号。设备创建时,完成设备的一些初始化,包括分配读缓冲器和写缓冲器、创建读写同步和互斥信号量和初始化等待任务列表等;调用int Connect(例程完成C AN设备的中断注册,该例程将中断服务程序Can I ntr与指定的中断向量vect or连接;调用sysI ntEnableP I C(例程允许C AN

22、设备中断;最后调用i os De2 v Add(例程,这个例程向I/O系统的设备链表DE V I CE L I ST 中加入一个CAN设备,并设置C AN设备头结构的驱动号(drv _nu m为设备驱动初始化时返回的驱动号和设备名na me为“/ can/0”(假设用这个设备名字,使得设备对于以后的open(和create(例程可用。(3设备打开Can Open(设备打开,主要完成CAN控制器的初始化工作,返回必须是一个CAN设备指针,这是由于该指针一定要赋值给文件表F D_T ABLE中文件条目F D_E NT RY的第一项pDevHdr。初始化CAN控制器,主要在复位时为各个寄存器设置正确

23、的初值。在设置控制器的寄存器前,必须通过读模式寄存器的复位模式/请求(Reset Mode/Request标志来检查控制器是否已进入复位模式,因为要得到配置信息的寄存器,仅在复位模式可写5。在复位模式中,必须配置下面的控制段寄存器:模式寄存器选择模式;时钟分频寄存器;验收代码寄存器和验收屏蔽寄存器;总线定时寄存器;输出控制寄存器;中断使能寄存器。退出复位模式时,必须清除模式寄存器的复位模式/请求标志位,要必须先检查标志是否确实被清除,是否进入了工作模式,才能进行下一步的操作,这通过循环读该标志实现。(4报文的发送Can W rite(和报文的接收CanRead(数据流程的层次关系如图3所示。应

24、用层调用通用i oL ib 中的函数Read和W rite,这些函数从输入的fd中找到相应的设备描述符,然后找到DRV_T ABLE,调用DRV_T ABLE中的函数。DRV_T ABLE中的函数则是第二层的C AN驱动例程(Can2 Read,Can W rite,再由C AN驱动例程和真正的CAN设备打交道。第二层和底层的通信是通过中断回调函数(Can I Rx、Can2 I Tx来实现。具体地说,中断服务程序负责数据的收发。输出时,底层驱动可以从CAN Out put R ing Buffer中得到数据并将数据发送到CAN Bus;输入时,底层驱动将接收到的数据读到C AN I nput

25、 R ing Buffer中 。报文的发送主要是完成用户向C AN写缓冲器写数据的工作。报文发送是以循环方式依次将每一帧数据写入写缓冲器的。对于每一帧数据:必须获得写同步信号量和互斥信号量独占缓冲区;将数据写入写缓冲器,修改写缓冲器的写指针;释放互斥信号量,如果缓冲器还有空间,则释放写同步信号量,退出对C AN缓冲器的独占使用。循环结束时,返回发送的数据字节数。设备创建Can DevCreate在创建写缓冲器时释放写同步信号量,也就是说调用该例程的第一个任务是不阻塞的。写同步信号量释放条件是:写缓冲器有空余空间。释放的时机是:写操作结束后,判断写缓冲器有空余空间时;中断写操作Can I Tx(

26、将一帧数据从写缓冲器写到C AN总线后;进入写操作后,但被I/O 控制操作取消时。调用该例程的任务,如果写缓冲器有空余空间时,完成写数据的工作;如果写缓冲器满时,则任务阻塞。报文的接收主要是完成用户从CAN 读缓冲器中读数据的工作:进入一个循环。在循环体内获得读同步信号量和互斥信号量,如果缓冲器中有数据则退出循环,否则释放互斥信号量并继续循环。进入依次读取每一帧数据的循环。为了唤醒阻塞在读同步信号量的任务,读完一帧数据后必须检查缓冲器是否还有数据,如果有,则释放读同步信号量,释放互斥信号量。返回实际读取的数据字节数。释放读同步信号量条件是:读缓冲器有数据。释放读同步信号量的时机:中断读Can

27、2I Rx (接收到C AN 总线上的数据帧,并把数据读到读缓冲器中后;读操作结束后,判断读缓冲器还有数据时;进入读操作后,但被I/O 控制操作取消时。调用该例程的任务,如果读缓冲器有数据时,完成读数据的工作;如果读缓冲器空时,则任务阻塞。(5中断服务Can I ntr (中断服务Can I ntr (读C AN 控制器的中断寄存器来识别中断源,然后根据不同的中断源进入不同的工作流程。这些中断源是由控制器复位时中断使能寄存器赋值决定的。这里只打开了发送和接收及数据溢出三种中断。中断写Can I Tx (如图4所示,CAN 控制器只有在发送状态为空闲、上一帧发送完毕和发送缓冲器释放的情况下,把中

28、断寄存器的发送中断位置高,并产生硬件中断信号通知CP U 把数据发送到CAN Bus 上去。如果CAN 设备写缓冲器有数据在等待发送,则马上将数据写入CAN 控制器发送缓冲器并命令发送数据,同时释放写同步信号量并唤醒等待设备的写任务;如果CAN 设备写缓冲器没有数据在等待发送,就直接返回。中断读Can I Rx (如图5所示,CAN 控制器发现CAN 总线上的数据己通过验收滤波器,则把数据存在接收数据缓冲器中,同时中断寄存器的接收中断位置高,并产生硬件中断信号通知CP U 有数据已经接收到。CP U 接收数据后,置位清除接收缓冲器位,释放读同步信号量并唤醒等待设备的读任务。CAN 控制器自动发

29、送回应信号表示已经接收到数据,对方节点可以马上再发送另一帧数据到总线上 。当接收数据数量超出CAN 控制器的接收缓冲器容量时,中断寄存器数据溢出位被置高,并产生硬件中断信号,通知CP U 已经有数据丢失。此时,CP U 重新对控制器进行初始化,再次进入正常工作状态。(6I/O 控制Can I octl (I/O 控制是根据I/O 请求控制代码的类型来控制C AN 设备的,主要包括读取或写缓冲器现有的数据帧数量;清除CAN 设备读或写缓冲器;按照请求的大小重新分配CAN 设备的读或写缓冲器;设置CAN 总线波特率;选择或取消CAN 设备的Select 功能;取消本次传输。最主要的是设置CAN 总线波特率,因为把一个节点加入到C AN 总线上时,该节点的波特率必须与其他的节点一致6。这里采用自动波特率检测算法,这是一个不影响网络运行操作的位速率检测算法。在只听模式,控制器不能发送报文也不能产生出错帧,只能接收报文。在启动时,用最高位速率接收报文之前,CAN 控制器使能接收中断和出错中断如果C AN 总线产生错误,程序会转向下一个较低的位速率,在成功地接收到一个报文后,C AN 控制器已经检测到正确的位速率,转向正常工作模式。4结束语按照上述思路编

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论