Vxworks多网口驱动程序设计.pdf

合集下载

VxWorks驱动程序

VxWorks驱动程序

串口设备驱动——ttyDrv 的层次结构

3. write() write()函数的调用过程是:write()→tyWrite()→xxDrv。 tyWrite 对所有的串行设备做同样的事情: ● 如果环形缓冲满,则阻塞; ● 从用户的缓冲中读数据到环形缓冲中; ● 在一定的情况下激活xxDrv 开始传输数据周期(一 个传输周期中首先传送数据到设备,然后等待设备给 出一个中断,以继续传送下一个数据); ● xxDrv 通过调用tyITx()来从输出环形缓冲中读数 据。
串口设备驱动——概述

串行设备驱动代码的分层结构图 vxWorks 的串行设备不同于前 面介绍的字符设备和块设备。 其驱动的结构如图 所示。从图 中可以看出:系统中的串行设 备驱动总共分3 层: usrConfig.c和ttyDrv(包括tyLib) 提供了一些对串行设备的一些 通用操作;而sysSerial.c 则针 对具体目标系统的、串行设备 有关的一些数据结构进行初始 化操作;最后xxDrv.c ( 在 cvtpxa270 BSP 中文件名为 pxa270FfnSio.c)包括了一些 具体设备相关的操作(如读/写 数据和设置等)。
串口设备驱动——概述

一个包含了串行设备及其应用程 序的总体模型如图所示。从图中 可以看出,串行设备的驱动xxDrv 并不是直接和I/O 系统交互的, 中间存在一个ttyDrv(包括 tyLib)。实际上,与IO 系统交 互的不是xxDrv的函数而是 ttyDrv/tyLib 提供的函数。另外, TargetAgent 可以和xxDrv 交互, 方便了系统的调试。ttyDrv(包 括tyLib):可以称为一个虚拟的 设备驱动。它只是介于I/O 与底 层具体设备驱动之间,为系统提 供统一的串行设备界面。

基于VxWorks系统的多网口驱动程序设计

基于VxWorks系统的多网口驱动程序设计

n eig D p rme tJui g V ct n l n c nc l o l e J j n i g i 3 0 7 C ia e r e a t n , i a o ai a a dTeh ia C l g ,i i gJa x 3 2 0 , hn ) n jn o e ua n
wa eb o k d a r m n r g a fo h r , n e n t ae wo i t r a e f n t n . r l c ig a a d p o r m l wc a t a d d mo s r t st n e f c u c i s o
C U 采 用 Moooa公 司 的 P weP 系 列 处 理 器 P trl o rC 之 一 的 MP 8 4 [ 该处 理器集 成 了 1 高性 能 的 C 21 , 个
收 稿 日期 :0 61—8 修 回 日期 :0 70 —6 2 0 —21 ; 2 0—41
基 于 P weP 内 核 的 R S o rC I C处 理 器 P weP 6 3 o rC 0e 和 1 P I 个 C 总线控 制 器 , o r C 0 e内 核速 度 可 P weP 6 3
责任编辑 : 李

作 者 简 介 : 经 元 (9 9)男 , 西 J l , 士 , 要 从 事控 制 黄 16 一 , 江  ̄) 人 硕 1 主
HU AN G i gy a CAIW e— i Jn — u n , ipn
( _ e to c a i De at n ,ii n cto a n c nc lColg ,ij n in x 3 0 7, h n ; . e to i n i 1 Elcr meh nc p rme t Jui g Vo ain la d Teh ia l e Jui g Ja g i3 2 0 C ia 2 Elcr nc E g— a e a

基于嵌入式操作系统的VxWorks设备驱动程序设计

基于嵌入式操作系统的VxWorks设备驱动程序设计

基于嵌入式操作系统的VxWorks设备驱动程序设计VxWorks是WindRiver公司开发的一种高性能的嵌入式实时操作系统(RTOS),以其优良的可靠性、开放性、实时性和易用性赢得了大量的客户。

VxWorks是目前嵌入式系统领域中使用最广泛、市场占有率最高的系统,被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。

在目前多数操作系统中,用户必须通过驱动程序才能与设备进行交互,正是设备驱动程序为其提供了可访问性和可操作性,而设备驱动程序本身跟操作系统的相关性特别密切。

本文针对VxWorks操作系统特点,分析设备驱动程序的功能、组成和开发过程,并给出END 网口驱动程序的一个设计实例。

1 嵌入式实时操作系统VxWorks下面首先围绕VxWorks的特点和结构这两个关键问题进行阐述。

1.1 VxWorks的特点1)可靠性操作系统的用户希望在一个工作稳定、可以信赖的环境中工作,所以操作系统的可靠性是用户首先要考虑的问题。

而稳定、可靠一直是VxWorks的一个突出优点。

自从对中国的销售解禁以来,VxWorks以其良好的可靠性在中国赢得了越来越多的用户。

2)实时性实时性是指能够在限定时间内执行完规定的功能并对外部的异步事件做出响应的能力。

实时性的强弱是以完成规定功能和做出响应时间的长短来衡量的。

VxWorks的实时性非常强,其系统本身的开销很小,进程调度、进程间通信、中断处理等系统公用程序精练而有效,它们造成的延迟很短。

VxWorks提供的多任务机制中对任务的控制采用了优先级抢占(Preemptive Priority Scheduling)和轮转调度(Round-Robin Scheduling)机制,也充分保证了可靠的实时性,使同样的硬件配置能满足更强的实时性要求,为应用的开发留下更大的余地。

3)可裁减性用户在使用操作系统时,并不是操作系统中的每一个部件都要用到。

VxWorks驱动程序设计与实现

VxWorks驱动程序设计与实现

中国计算机学会第十二届计算机工程与工艺学术年会VxWorks 驱动程序设计与实现Realization and Design of the Driver Based on VxWorks杨 康 吴家铸 刘衡竹* Yang kang Wu Jiazhu Liu Hengzhu (国防科技大学计算机学院 长沙 410073)(School of Computer Science, National University of Defense Technology )摘 要:VxWorks 自身已对硬件设备提供了非常广泛的支持,但是如果系统中采用了专用硬件设备则需要专门编写驱动程序。

本文详细分析VxWorks 环境下驱动程序开发与设计原理。

针对驱动程序实现的困难,给出VxWorks 下实现驱动程序的工作流程和基本框架。

关键词:VxWorks ;驱动程序;BSP ;设计实现*作者简介:杨康,男,硕士研究生,研究方向为嵌入式系统;吴家铸,男,副教授,研究方向嵌入式操作系统;刘衡竹,男,教授,博士生导师,研究方向为微处理器体系结构和嵌入式与SOC 芯片设计技术。

通信地址:410073 湖南长沙国防科技大学计算机学院。

1引言设备驱动是用于控制设备的程序集合,它将通用控制操作转换为设备能够识别的特定操作,是硬件设备的软件抽象。

作为I/O 系统和硬件设备之间的连接层,VxWorks 驱动程序就是屏蔽硬件操作,为I/O 系统提供服务。

实现一个完整的驱动,必须了解VxWorks 中I/O 系统的三个基本元素:FILE 、DRIVER 和DEVICE 。

FILE 是为用户提供访问设备的统一接口;DRIVER 是实现具体的基本控制函数,也就是实现I/O 系统所需要的接口;而DEVICE 是一个抽象的硬件设备,是一系列的结构体、变量和宏定义对实际物理设备的定义。

2设备驱动程序的设计与实现一般而言,实现一个驱动应该有三个基本的步骤:(1)用编程语言完成对实际物理设备的抽象;(2)完成系统所需要的各类接口及自身的特殊接口;(3)将驱动集成到操作系统中。

VxWorks网络驱动配置及分析

VxWorks网络驱动配置及分析

VxWorks网络驱动配置及分析VxWorks支持两种形式的网络驱动,一种是BSD驱动支持通用的BSD4.4网络,API,结构等和大多数BSD网络的驱动类似.另一种是END 网络驱动,是VxWorks独有的,根据VxWorks MUX接口编程,不过END驱动在底层也要转换成BSD的形式.VxWorks网络驱动可参见VxWorks网络驱动1.BSD4.4网络驱动设置.网络设备驱动的调用主要在/target/src/config/usrNetwork.c文件中,下面说明BSD4.4驱动在VxWorks系统调用.主要调用过程如下:VxWorks系统执行的第一个任务target\config\all\usrConfig.c文件中 usrRoot()=======>>target\src\config\usrNetwork.c文件中的usrNetInit( )通过数组表netIf[]初始化相应的BSD网卡驱动.在usrNetwork.c中的调用过程如下:usrNetInit()函数中调用usrNetIfAttach():#ifdef INCLUDE_BSDif (!attached){if ( (usrNetIfAttach (pNetDev, params.unitNum, pBootString) !=OK))return (ERROR);attached = TRUE;}#endif /*INCLUDE_BSD*/usrNetIfAttach ()函数中调用数组表usrNetIfTblfor (pNif = usrNetIfTbl; pNif->ifName != 0; pNif++){if (strcmp (buf, pNif->ifName) == 0)break;}网络BSD驱动数组表usrNetIfTbl在文件/target/src/config/usrNetwork.c中的定义初始化:...LOCAL NETIF netIf [] = /* 网络接口,定义网卡驱动 */{/* 下面是定义包含的各种网络驱动 */#ifdef INCLUDE_DC /* 从DEC 芯片启动,即系统有NVRAM存在,现在已过时*/{ "dc", dcattach, (char*)IO_ADRS_DC, INT_VEC_DC, INT_LVL_DC,DC_POOL_ADRS, DC_POOL_SIZE, DC_DATA_WIDTH, DC_RAM_PCI_ADRS,DC_MODE },#endif /* INCLUDE_DC */#ifdef INCLUDE_FEI /* 如果定义了INCLUDE_FEI,初始化Intel 网卡 */{ "fei", feiattach, (char*)FEI_POOL_ADRS, 0, 0, 0, 0},#endif /* INCLUDE_FEI */#ifdef INCLUDE_EX /* Excelan 网卡 */{ "ex", exattach, (char*)IO_ADRS_EX, INT_VEC_EX, INT_LVL_EX,IO_AM_EX_MASTER, IO_AM_EX },#endif /* INCLUDE_EX */#ifdef INCLUDE_ENP /* CMC 网卡 */{ "enp", enpattach, (char*)IO_ADRS_ENP, INT_VEC_ENP, INT_LVL_ENP, IO_AM_ENP },#endif /* INCLUDE_ENP */...}设置方法:从以上可以看出BSD网络驱动只需在BSP配置文件config.h中将网络(#define INCLUDE_NETWORK)BSD网卡宏定义(#define INCLUDE_xxx)和一些I/O参数(一般不需要)加入,则在文件usrNetwork.c中进行相应的初始化.如: 在VxWorks加入支持intel的网卡驱动.在config.h中加入"#define INCLUDE_FEI".主要网卡定义如下:#define INCLUDE_ENE /* include Eagle/Novell NE2000 interface */#define INCLUDE_ELT /* include 3COM EtherLink III interface */ #define INCLUDE_ESMC /* include SMC 91c9x Ethernet interface */#define INCLUDE_FEI /* include Intel Ether Express PRO100B PCI */#define INCLUDE_ELC /* include SMC Elite16 interface */#define INCLUDE_EEX /* include INTEL EtherExpress interface */#define INCLUDE_EEX32 /* include INTEL EtherExpress flash 32 */#define INCLUDE_EX /* include Excelan Ethernet interface */ #define INCLUDE_ENP /* include CMC Ethernet interface*/#define INCLUDE_SM_NET /* include backplane net interface */ #define INCLUDE_SM_SEQ_ADDR /* shared memory network auto address setup */#define INCLUDE_EL_3C90X_END /* 3com fast etherLink XL PCI */#define INCLUDE_LN_97X_END /* AMD 79C972 END DRIVER */....2.END网络驱动设置.END网络设备的初始化主要通过定义在文件configNet.h中的一个数组表实现.初始化网络时muxDevLoad()会按这个表的定义把end初始化安装到VxWorks 系统.主要调用过程:VxWorks系统执行的第一个任务target\config\all\usrConfig.c文件中 usrRoot()=======>>target\src\config\usrNetwork.c文件(该文件初始化TCP/IP)中 usrNetInit(BOOT_LINE_ADRS)(该函数作用是添加MUX END)========>>pcooki = pCookie =muxDevLoad(pDevTbl->unit,.....)其中pDevTbl在BSP网络配置文件configNet.h中定义.END_TBL_ENTRY endDevTbl[]={...},该表定义了网络设备的具体参数.configNet.h部分定义如下所示:#define DEC_LOAD_FUNC dec21x40EndLoad /* 定义加载网络设备的入口程序*/#define DEC_BUFF_LOAN 1/* 网络设备硬件的物理定义数据串,一般BSP已经定义,不到必要时,无需更改*//** <devAdrs>:<PCIadrs>:<ivec>:<ilevel>:<numRds>:<numTds>:<memBase>: \ * <memSize>:<userFlags>*/# define DEC_LOAD_STRING"0x81020000:0x80000000:0x12:0x12:-1:-1:-1:0:0x80800000"IMPORT END_OBJ* DEC_LOAD_FUNC (char*, void*);/* 网络END设备表 */END_TBL_ENTRY endDevTbl [] ={ 0, DEC_LOAD_FUNC, DEC_LOAD_STRING, DEC_BUFF_LOAN, NULL, FALSE}, { 0, END_TBL_END, NULL, 0, NULL, FALSE},};设置方法:由以上可看出在VxWorks添加END网络驱动1.在文件config.h中添加"#define INCLUDE_NETWORK"和"#defineINCLUDE_END".2.在configNet.h中加入END驱动的入口函数"#definexxx_LOAD_FUNC xxxxxEndLoad"和一些相关的初始化字符串.这样就会在生成BSP包含END/MUX,系统网络初始化调用函数muxDevLoad()会更据这个表初始化END网络.文件configNet.c关于END驱动初始化的主要内容:#ifdef INCLUDE_ENDIMPORT int ipAttach ();IMPORT END_TBL_ENTRY endDevTbl[]; /* 定义这个表 */#endif /* INCLUDE_END */..........#ifdef INCLUDE_ENDint count;END_TBL_ENTRY* pDevTbl; /* END设备列表 */END_OBJ* pCookie = NULL;END_OBJ* pEnd;#endif /* INCLUDE_END */#if defined(INCLUDE_END)muxMaxBinds = MUX_MAX_BINDS; /* 初始化MUX接口 */if (muxLibInit() == ERROR)..........关于DEFAULT_BOOT_LINE 的解释这一行对配置网络,连通Target Server及下载调试程序非常重要DEFAULT_BOOT_LINE的原意是为没有NVRAM的target设计的,这样用户就不需要在每次系统启动是手工输入这些参数了.系统启动网络时xxxEndLoad()会解释这一行并按这一行的定义进行加载.Emac(0,0) : 启动设备,可是是软盘,硬盘,PCMCIA卡等其他的设备名称如:fd为软盘,(0,0)表示第一个软驱,3.5寸盘.dc则表示从DEC 21x4x 芯片启动,即系统有NVRAM存在,这种方式现在已不采用. elpci表示启动设备为3COM EtherLink XL PCI网卡.fei:Intel 82559 EtherExpress网卡.ene: NE2000网卡ELT: 3COM以太网卡EEX: Intel网卡ata: ATA/IDE 硬盘 ............405GP: 主机名vXworks从主机加载的VxWorks文件h=172.16.1.159 主机的IP地址e=172.16.254.52 目标机的IP地址,若网络启动Target Server时,这个IP必须和主机上Target Server配置的Target IP地址一致,且设置Back End选项为wdbrpcu=xxx 用户名,pw=xxx 密码: 若通过网络加载调试时,主机的Ftp服务器和目标机的用户名和密码必须相同tn=vxTarget 目标机名称*/#define DEFAULT_BOOT_LINE \"Emac(0,0)405GP:vxWorks h=172.16.1.159 e=172.16.254.52 \u=xxx pw=xxx tn=vxTarget"高智商学生 ( Thu, 1 Jun 2006 20:32:04 +0800 )Description:某日,老师在课堂上想看看一学生智商有没有问题,问他:“树上有十只鸟,开枪打死一只,还剩几只?”他反问:“是无声手枪或别的无声的枪吗?”“不是。

VxWorks 驱动程序安装指南说明书

VxWorks 驱动程序安装指南说明书

Document: CTI_SIO_Install Revision: 1.01Date: January 4, 2010 VxWorksDriver InstallationVxWorks Driver Installation1.H ISTORY (3)2.H ARDWARE R EQUIREMENTS (4)3.D RIVER F ILES (4)4.C ONFIGURATION (4)4.1. BSP Files (4)4.1.1. config.h (4)4.1.1.1. INCLUDE_CTI_U550 (4)4.1.1.2. INCLUDE_CTI_U650 (5)4.1.1.3. INCLUDE_CTI_U850 (5)4.1.1.4. INCLUDE_CTI_EXAR17XX5XPCI (5)4.1.1.5. CTI_PCI_MAXBOARDS (5)4.1.1.6. CTI_PCI_MAXCHANS (5)4.1.1.7. INCLUDE_CTI_AUTO485POLLER (5)4.1.1.8. CTI_DEFAULT_BAUD (6)4.1.1.9. CTI_AUTO485SWITCHBAUD (6)4.1.1.10. CTI_AUTO485POLLER_DELAY (6)4.1.1.11. CTI_SYS_PCI_INTCONNECT() (6)4.1.1.12. CTI_SYS_INTCONNECT() (6)4.1.1.13. CTI_SYS_INTENABLE() (7)4.1.1.14. CTI_SYS_IN_BYTE() (7)4.1.1.15. CTI_SYS_OUT_BYTE() (7)4.1.1.16. CTI_SYS_IN_WORD() (8)4.1.1.17. CTI_SYS_OUT_WORD() (8)4.1.1.18. CTI_SYS_IN_LONG() (8)4.1.1.19. CTI_SYS_OUT_LONG() (9)4.1.2. sysLib.c (9)4.1.2.1. sysHwInit() (9)4.1.2.2. sysHwInit2() (10)4.2. Driver Files (10)4.2.1. sysCTISerial.c (10)4.2.1.1. Storage (10)4.2.1.2. Configuration (11)4.2.1.3. Interrupts (12)4.2.1.4. Enumeration (13)4.3. Tornado Projects (14)4.3.1. Connect Tech Inc. SIO (14)4.3.2. Use alternate base name (14)5.E XAMPLES (14)5.1. pcP3CTI_1 (14)5.2. pcP3CTI_2 (14)5.3. pcP3CTI_3 (15)6.I NSTALLATION C HECKLIST (16)1. HistoryOriginal draft.Added installation checklist.Added 3rd sample BSP.Fixed minor mistakes.Adapted for both Tornado and Workbench builds.2. Hardware RequirementsThis driver supports the following products:Xtreme/104 switchableXtreme/104 232BlueStorm/LPXtreme/104-Plus3. Driver FilesCopy the following files into your BSP directory (<WIND_INST>\target\config\<BSP_NAME>):00cti.cdfctiSio.cctiSio.hsysCTISerial.cusrCTISerial.c4. Configuration4.1. BSP FilesThe following files should be modified to support the CTI SIO driver. These modifications can be done in any other way as appropriate, but the following are suggestions made based on the Pentium III BSP. For sample modified files, refer to the files (of the same name) located within the driver distribution package. Sample files are from the Pentium III BSP. Note; file names and locations of information may differ in your BSP.<WIND_INST>\target\config\<BSP_NAME>\config.h<WIND_INST>\target\config\<BSP_NAME>\sysLib.cThe sample files included with the driver package should not be copied over any files in your BSP. These sample files are included only so that you can see the required changes in the context of complete files.4.1.1.config.hAdd a section to your config.h file so that there is a place for the driver options. If your config.h has an “if-def” block used to determine when to define INCLUDE_PCI, it is advised that you place this new section above that “if-def” block. This suggestion is made so that the “if-def” section can be modified to define INCLUDE_PCI when needed by any included CTI boards. The section for CTI driver configuration should surrounded by a check forINCLUDE_CTI_SIO being defined.For example:/* Connect Tech Inc. serial driver options */#if defined(INCLUDE_CTI_SIO)#define INCLUDE_CTI_U550/* support for 550 UARTs */#endif/* defined(INCLUDE_CTI_SIO) */A complete list of the available configuration options follows:4.1.1.1.INCLUDE_CTI_U550Define INCLUDE_CTI_U550 to include support for Xtreme/104 products that utilize 550 UARTs. This can be determined by examining the UART chips on the Xtreme/104 board itself, or by contacting CTI support staff.Usage:#define INCLUDE_CTI_U5504.1.1.2.INCLUDE_CTI_U650Define INCLUDE_CTI_U650 to include support for Xtreme/104 products that utilize 650 UARTs. This can be determined by examining the UART chips on the Xtreme/104 board itself, or by contacting CTI support staff.Usage:#define INCLUDE_CTI_U6504.1.1.3.INCLUDE_CTI_U850Define INCLUDE_CTI_U850 to include support for Xtreme/104 products that utilize 850 UARTs. This can be determined by examining the UART chips on the Xtreme/104 board itself, or by contacting CTI support staff.Usage:#define INCLUDE_CTI_U8504.1.1.4.INCLUDE_CTI_EXAR17XX5XPCIDefine INCLUDE_CTI_EXAR17XX5XPCI to include support for BlueStorm/LP and Xtreme/104-Plus products. You should also include you BSP’s PCI support if these pr oducts are to be used.Usage:#define INCLUDE_CTI_EXAR17XX5XPCI4.1.1.5.CTI_PCI_MAXBOARDSCTI_PCI_MAXBOARDS is used to define the maximum number of CTI PCI boards that can be enumerated. If not defined the default is 1.Usage:#define CTI_PCI_MAXBOARDS X/* where X is the maximum number of boards */4.1.1.6.CTI_PCI_MAXCHANSCTI_PCI_MAXCHANS is used to define the maximum number of serial channels that can be used by enumerated CTI PCI devices. This number is not the maximum per CTI PCI device, it is the maximum total number of channels across all CTI PCI devices. If not defined the default is 8.Usage:#define CTI_PCI_MAXCHANS X/* where X is the maximum number of channels */4.1.1.7.INCLUDE_CTI_AUTO485POLLERWhen using half-duplex RS485, the receiver and transmitter need to be toggled on and off depending on whether data is being sent or received. On CTI products that do not utilize UARTs with the capability to do this automatically, the driver must perform the toggling.This can be done in one of two ways; Using the interrupt service routine (ISR) of thechannel; Using a watchdog timer as a poller. In order to use the watchdog timerINCLUDE_CTI_AUTO485POLLER must be defined.Usage:#define INCLUDE_CTI_AUTO485POLLER4.1.1.8.CTI_DEFAULT_BAUDCTI_DEFAULT_BAUD is used to define the default baud rate when the serial channels are initialized. If not defined the default is 9600.Usage:#define CTI_DEFAULT_BAUD X/* where X is the default baud rate in bps */4.1.1.9.CTI_AUTO485SWITCHBAUDWhen using the CTIAUTO485SWITCHED auto 485 direction control method,CTI_AUTO485SWITCHBAUD defines the baud rate used to switch between ISR and poller methods. When the baud rate is less than CTI_AUTO485SWITCHBAUD the ISR method is used, else the poller method is used. If not defined the default is 9600.Usage:#define CTI_AUTO485SWITCHBAUD X/* where X is the baud rate in bps */4.1.1.10.CTI_AUTO485POLLER_DELAYWhen the poller auto 485 direction control method is being used a watchdog timerperforms a polling operation to look for the end of a transmit. This watchdog timer is set to expire every CTI_AUTO485POLLER_DELAY ticks. If not defined the default is 1.Usage:#define CTI_AUTO485POLLER_DELAY X/* where X is the delay in ticks */4.1.1.11.CTI_SYS_PCI_INTCONNECT()The CTI_SYS_PCI_INTCONNECT() macro is used to connect a PCI device interrupt to an interrupt service routine. The default definition of this macro uses pciIntConnect().Usage:/** _intLevel_ - interrupt level to connect _isr_ to* _isr_ - interrupt service routine to connect to _intLevel_* _arg_ - argument to be passed to _isr_* _result_ - STATUS result of the macro*/#define CTI_SYS_PCI_INTCONNECT(_intLevel_, _isr_, _arg_, _result_) \{ \/* place desired code here */ \}4.1.1.12.CTI_SYS_INTCONNECT()The CTI_SYS_INTCONNECT() macro is used to connect a device interrupt to an interrupt service routine. The default definition of this macro uses intConnect().Usage:/** _intLevel_ - interrupt level to connect _isr_ to* _isr_ - interrupt service routine to connect to _intLevel_* _arg_ - argument to be passed to _isr_* _result_ - STATUS result of the macro*/#define CTI_SYS_INTCONNECT(_intLevel_, _isr_, _arg_, _result_) \{ \/* place desired code here */ \}4.1.1.13.CTI_SYS_INTENABLE()The CTI_SYS_INTENABLE() macro is used to enable an interrupt level. The defaultdefinition of this macro uses sysIntEnablePIC().Usage:/** _intLevel_ - interrupt level to enable* _result_ - STATUS result of the macro*/#define CTI_SYS_INTENABLE(_intLevel_, _result_) \{ \/* place desired code here */ \}4.1.1.14.CTI_SYS_IN_BYTE()The CTI_SYS_IN_BYTE() macro is used to read an 8 bit value. The default definition of this macro uses sysInByte() for port I/O and does a direct assignment for memory I/O.Usage:/** _ioMode_ - I/O mode (CTIIOPORT or CTIIOMEM)* _address_ - address to read from* _value_ - receives 8 bit value read from _address_*/#define CTI_SYS_IN_BYTE(_ioMode_, _address_, _value_) \{ \if((_ioMode_) == CTIIOPORT) { \/* place port I/O code here */ \} \else { \/* place memory I/O code here */ \} \}4.1.1.15.CTI_SYS_OUT_BYTE()The CTI_SYS_OUT_BYTE() macro is used to write an 8 bit value. The default definition of this macro uses sysOutByte() for port I/O and does a direct assignment for memory I/O.Usage:/** _ioMode_ - I/O mode (CTIIOPORT or CTIIOMEM)* _address_ - address to write to* _value_ - 8 bit value to write to _address_*/#define CTI_SYS_OUT_BYTE(_ioMode_, _address_, _value_) \{ \if((_ioMode_) == CTIIOPORT) { \/* place port I/O code here */ \} \else { \/* place memory I/O code here */ \} \}4.1.1.16.CTI_SYS_IN_WORD()The CTI_SYS_IN_WORD() macro is used to read a 16 bit value. The default definition of this macro uses sysInWord() for port I/O and does a direct assignment for memory I/O.Usage:/** _ioMode_ - I/O mode (CTIIOPORT or CTIIOMEM)* _address_ - address to read from* _value_ - receives 16 bit value read from _address_*/#define CTI_SYS_IN_WORD(_ioMode_, _address_, _value_) \{ \if((_ioMode_) == CTIIOPORT) { \/* place port I/O code here */ \} \else { \/* place memory I/O code here */ \} \}4.1.1.17.CTI_SYS_OUT_WORD()The CTI_SYS_OUT_WORD() macro is used to write a 16 bit value. The default definition of this macro uses sysOutWord() for port I/O and does a direct assignment for memory I/O.Usage:/** _ioMode_ - I/O mode (CTIIOPORT or CTIIOMEM)* _address_ - address to write to* _value_ - 16 bit value to write to _address_*/#define CTI_SYS_OUT_WORD(_ioMode_, _address_, _value_) \{ \if((_ioMode_) == CTIIOPORT) { \/* place port I/O code here */ \} \else { \/* place memory I/O code here */ \} \}4.1.1.18.CTI_SYS_IN_LONG()The CTI_SYS_IN_LONG() macro is used to read a 32 bit value. The default definition of this macro uses sysInLong() for port I/O and does a direct assignment for memory I/O.Usage:/** _ioMode_ - I/O mode (CTIIOPORT or CTIIOMEM)* _address_ - address to read from* _value_ - receives 32 bit value read from _address_*/#define CTI_SYS_IN_BYTE(_ioMode_, _address_, _value_) \{ \if((_ioMode_) == CTIIOPORT) { \/* place port I/O code here */ \} \else { \/* place memory I/O code here */ \} \}4.1.1.19.CTI_SYS_OUT_LONG()The CTI_SYS_OUT_LONG() macro is used to write a 32 bit value. The default definition of this macro uses sysOutLong() for port I/O and does a direct assignment for memory I/O.Usage:/** _ioMode_ - I/O mode (CTIIOPORT or CTIIOMEM)* _address_ - address to write to* _value_ - 32 bit value to write to _address_*/#define CTI_SYS_OUT_LONG(_ioMode_, _address_, _value_) \{ \if((_ioMode_) == CTIIOPORT) { \/* place port I/O code here */ \} \else { \/* place memory I/O code here */ \} \}4.1.2.sysLib.cAdd a section to your sysLib.c file that includes the file sysCTISerial.c. This file includes the CTI SIO driver and defines routines used to configure the CTI serial channels. This section should come after the PCI configuration files have been included and should be surrounded by a check for INCLUDE_CTI_SIO being defined.For example:#if defined(INCLUDE_CTI_SIO)#include "sysCTISerial.c"#endif/* defined(INCLUDE_CTI_SIO) */In addition to including the driver and driver configuration routines, the routines sysHwInit() and sysHwInit2() need to be modified to call the serial configuration routines defined in sysCTISerial.c.4.1.2.1.sysHwInit()During sysHwInit(), sysCTISerialHwInit() should be called to initially configure the CTIserial channels. This call should be made after any PCI initialization in order for CTI PCI adapters to be configured.For example:#if defined(INCLUDE_CTI_SIO)sysCTISerialHwInit();#endif/* defined(INCLUDE_CTI_SIO) */4.1.2.2.sysHwInit2()During sysHwInit2(), sysCTISerialHwInit2() should be called to connect and enableinterrupts used by the CTI serial channels.For example:#if defined(INCLUDE_CTI_SIO)sysCTISerialHwInit2();#endif/* defined(INCLUDE_CTI_SIO) */4.2. Driver FilesThe file sysCTISerial.c, which is included into sysLib.c, needs to be configured to properly match the setup of your system.4.2.1.sysCTISerial.csysCTISerial.c contains rountines used to configure any CTI serial adapters you have. The configuration includes:storage for board and channel structuresboard/channel configuration and initializationinterrupt connecting and enablingchannel enumerationThe code in this section is only meant to serve as a short example. For a more complete sample refer to the sample BSP’s provided with the driver files. For a description of routine parameters refer to the documentation for that routine.4.2.1.1.StorageEach board and channel must have a corresponding structure allocated for it. This istypically done by declaring local variables in the file sysCTISerial.c.Typically one board structure (CTI_BOARD) is defined for each non-PCI CTI adapter.For example:LOCAL CTI_BOARD ctiXt1Board;LOCAL CTI_BOARD ctiXt2Board;For each of the non-PCI adapters, an array of channel structures should be defined aswell. The size of these arrays depends on the number of channels supported by theadapters.For example:LOCAL CTI_CHAN ctiXt1Chans[8];LOCAL CTI_CHAN ctiXt2Chans[4];For PCI adapters, only one instance of CTI_PCI_DEVICESET need be defined. The maximum number of supported adapters and channels should be defined with CTI_PCI_MAXBOARDS and CTI_PCI_MAXCHANS (see section 4.1.1 - config.h for more information onCTI_PCI_MAXBOARDS and CTI_PCI_MAXCHANS).For example:#if defined(INCLUDE_PCI)LOCAL CTI_PCI_DEVICESET ctiPciDevset;#endif/* defined(INCLUDE_PCI) */4.2.1.2.ConfigurationDuring sysHwInit() sysCTISerialHwInit() should be called. This is where the board andchannels structures declared in the previous section are configured and initialized.Each non-PCI board structure should be configured using ctiBoardConfig() and initialized using ctiBoardHrdInit().PCI adapters should be enumerated and initialized using ctiPciConfig() and ctiPciHrdInit().For example:void sysCTISerialHwInit(void){if(OK == ctiBoardConfig(&ctiXt1Board,CTIU650,CTIIOPORT,0x300,0x340, /* 0 if status port not being used */0x05,7372800,4, /* 1 if using extended baud rates */ctiXt1Chans,8,NULL,NULL,0xFF)){if(sysBp) {ctiBoardHrdInit(&ctiXt1Board);}}if(OK == ctiBoardConfig(&ctiXt2Board,CTIU850,CTIIOPORT,0x200,0x240, /* 0 if status port not being used */0x0A,7372800,4, /* 1 if using extended baud rates */ctiXt2Chans,4,NULL,NULL,0xF)){if(sysBp) {ctiBoardHrdInit(&ctiXt2Board);}}#if defined(INCLUDE_PCI)if(OK == ctiPciConfig(&ctiPciDevset, NULL, NULL)) {if(sysBp) {ctiPciHrdInit(&ctiPciDevset);}}#endif/* defined(INCLUDE_PCI) */}4.2.1.3.InterruptssysCTISerialHwInit2() should be called during sysHwInit2() and is responsible for connecting and enabling interrupts used by the CTI adapters.The operations of connecting an interrupt to an interrupt service routine as well asenabling the interrupt have been encapsulated into driver rountines ctiBoardIntConnect() and ctiPciIntConnect(). The behaviour of these routines is controlled by the macrosCTI_SYS_INTCONNECT(), CTI_SYS_PCI_INTCONNECT(), and CTI_SYS_INTENABLE(). These macros can be redefined from their default behaviour. See section 4.1.1 - config.h formore information on CTI_SYS_INTCONNECT(), CTI_SYS_PCI_INTCONNECT(), andCTI_SYS_INTENABLE(). These routines do not have to be used and in some cases may not be sufficient. The specifics of their operation can be seen in ctiSio.c.For example:void sysCTISerialHwInit2(void){ctiBoardIntConnect(&ctiXt1Board);ctiBoardIntConnect(&ctiXt2Board);#if defined(INCLUDE_PCI)ctiPciIntConnect(&ctiPciDevset);#endif/* defined(INCLUDE_PCI) */}4.2.1.4.EnumerationEach serial channel must be associated with a device. The CTI serial channels areenumerated using sysCTISerialChanGet(). This routine takes an index value specifyingwhich channel structure to retrieve, and effectively acts as a look-up table for thechannels. The order in which the channels are returned determines the order in which the channels are associated with device names.For example:SIO_CHAN* sysCTISerialChanGet(int channel/* serial channel */){if((channel >= 0) && (channel < 8)) {return((SIO_CHAN*)&ctiXt1Chans[channel]);}else if((channel >= 8) && (channel < (8 + 4))) {return((SIO_CHAN*)&ctiXt2Chans[channel - 8]);}#if defined(INCLUDE_PCI)else if((channel >= (8 + 4)) &&(channel < (8 + 4 + hans))){return((SIO_CHAN*)&(ctiPciDevset.pChans[channel - 8 - 4]));}#endif/* defined(INCLUDE_PCI) */return((SIO_CHAN*)ERROR);}The total number of channels needs to be reported using sysCTISerialGetNumChans(). This routine simply needs to return the total number of channels being used across all CTIadapters.For example:UINT16sysCTISerialGetNumChans(void){UINT16retVal = 0;retVal += 8;retVal += 4;#if defined(INCLUDE_PCI)retVal += hans;#endif/* defined(INCLUDE_PCI) */return(retVal);}4.3. Tornado/WorkBench ProjectsBootable VxWorks image projects based on a BSP containing the CTI driver files will have a new folder available under hardware\peripherals\serial called “Connect Tech Inc.”. This folder contains components for controlling the CTI serial driver. A description of the components follows:4.3.1.Connect Tech Inc. SIOThis component controls INCLUDE_CTI_SIO (used earlier when including the CTI serial driver in the BSP).e alternate base nameIf this component is not included, the CTI serial channels will be named “/tyCo/X” where X is the channel index value and is based on the defined NUM_TTY value so that the names do not collide with other serial devices. However, it may be desireable to use a different base name. By including the Use alternate base name component, the default behaviour is to name the CTI serial channels “/tyCTI/X” where X is the channel index value starting at 0.The Use alternate base name component has a parameter called CTI_TY_NAME_BASE which can be used to set a base name other than “/tyCTI/”.5. ExamplesIncluded with the driver files are three example BSP’s. These example BSP’s are based on the Pentium III BSP from WindRiver. A description of each of the example BSP’s follows:5.1. pcP3CTI_1This example is based on the following CTI serial adapters:Xtreme/104 RS-2328 channels.Base I/O address is 0x300.IRQ is 10.Status port is in use.Extended baud rates not in use.BlueStorm/LP RS-2324 channels.5.2. pcP3CTI_2This example is based on the following CTI serial adapters:Xtreme/104 14 RS-232 channels.Base I/O address is 0x300.IRQ is 10.Status port is in use.Extended baud rates not in use.Xtreme/104 28 channels.Base I/O address is 0x200.Channels 1, 3, 5, and 7 are on IRQ 5, channels 2, 4, 6, and 8 are on IRQ 9. SeeMode 2 in the Interrupt Selection section of the Xtreme/104 manual.Status port is not in use.Extended baud rates in use.Channels 1 and 2 are RS-232, channels 3, 4, and 5 are RS-485 full-duplex,channels 6, 7, and 8 are RS-485 half-duplex.Xtreme/104-Plus Switchable4 channels.Channels 1 and 2 are RS-485 full-duplex, channels 3 and 4 are RS-232.5.3. pcP3CTI_3This example is based on the following CTI serial adapters:BlueStorm/LP8 RS-232 channels.6. Installation Checklist。

实时操作系统VxWorks下多串口通讯设计

实时操作系统VxWorks下多串口通讯设计
图 2 多串口中断服务程序流程
RDA: IPort= sysInByte( Port+ 5); if ( IPort& 0x01 ) { W rk= sysInByte( P ort); if (! ( IPort& 0x04 ) ) { P r= pwk - > RXDR; Pw = pwk - > RX DW; p w k- > p RXD[ Pw ] = W rk ; Pw + + ; Pw& = pwk- > RXDS ; if ( Pw! } goto RDA; } AnyRC | = BIT; /* 置当前串口收到数据标志位 * / RCB it| = B I T; /* 置当前串口收到数据标志位 * / break ; case 0x06 : W rk= sysInByte( Port+ 5) ; } goto STA; EdA: sysOutB y te( I NTPTA, 0x20); sysOutB y te( I NTPTC, 0x20) ; }
串口参数选择vxworks实时操作系统通过io控制函数ioctl串口控制功能字功能字功能fiobaudrate设置串口波特率fiocancel取消读写操作fioflush清空输入缓冲和输出缓冲fiogetname得到文件设备名fiogetoptions返回当前的设备选项字fionread得到输入缓冲中未读取的字节数fionwrite得到输出缓冲中的字节数fiosetoptions设置设备选项字串口数据读写vxworks实时操作系统可通过select函数使串口读写任务一直处于阻塞状态直到串口设备文件准备好
2 多串口初始化流程
基于 PC /104 模块的嵌入式系统 , 串行通信是 常用的通信方式之一。通过串行数据端口 , 可以实 现 PC /104 与 PC 机以及 PC /104 模块之间的通信。 本文采用盛博科技有限公司的 SE M /M SP - 12( A ) 嵌入式模块 , 在嵌入式系统中扩展 8 个以上的串行 端口, 实现多串口数据通信扩展设计。 VxW orks系统平台下多串口初始化操作流程如 图 1 所示。 74

最新-VxWorks下PC2019019-CAN驱动程序设计 精品

最新-VxWorks下PC2019019-CAN驱动程序设计 精品

VxWorks下PC104-CAN驱动程序设计摘要详细介绍实时多任务操作系统环境下驱动程序的设计原理;针对驱动程序实现的困难,给出下实现驱动程序的工作步骤。

文件以104-适配卡为例,简要介绍硬件结构,重点给出驱动程序实现的关键代码。

关键词104系统驱动系统是一款优秀的实时多任务操作系统,具有抢占式调试、中断延迟小等特点。

本文在简要介绍必备的硬件环境下,以为平台,详细介绍驱动程序的开发。

1104-适配卡的硬件结构104-适配卡主要由控制器1000、光电隔离6137,收发驱动器82250及译码电路组成。

编程主要了解的是控制器1000。

适配卡原理如图1所示。

范文先生网收集整理2地址译码和中断选择系统104主板的为486,其对接口板访问有两种方式内存映射和访问。

寻址采用专门的指令,每次只能传送单个字节。

内存映射方式可以访问较大的地址空间并且指令丰富,便于实现快速交换数据。

本文讨论的卡采用存映射模式工作,与486接口是104总线,它与总线兼容。

对于86体系的,可以映射的空间为08000~0。

使用比较器和地址选择开关组成可选端口地址译码电路,通过开关选通内存映射基地址8000、9000、000、…、000,以避免与其它器件冲突。

偏移地址分配如下00~1000的寄存器;100~1对该范围内的任意地址进行写操作,均可导致硬件复位。

1000的引脚通过跳线选择3~7、9~12或15中的一个,避免与其它的适配卡冲突。

3104-适配卡驱动实现31驱动概述操作系统有两种方式实现驱动。

第一种方式是,把设备驱动程序作为独立任务实现,直接在顶层任务中实现硬件操作,完成特有专用的驱动程序。

第二种方式是,的系统将设备程序作为内核过程实现。

这种方式便于实现子系统的层次模型,便于文件系统一起把设备作为特殊文件处理,提供统一的管理、统一的界面和统一的使用方法,并把设备、文件及网络通信组织成为一致的更高层次的抽象,为用户提供统一的系统服务和用户接口。

VxWorks下网卡驱动设计

VxWorks下网卡驱动设计

基于VxWorks的网卡驱动设计摘要:随着嵌入式技术在军工、信息家电中的应用,如何在嵌入式实时系统下对网卡进行驱动程序的设计以及实现网络通信和管理,成为非常重要的技术。

本文首先从整体上VxWorks网络系统得基本原理和与结构,然后以Intel82557网卡驱动为例,着重介绍网络设备驱动程序设计与实现过程。

本文对所有基于MUX机制下的VxWorks网络设备驱动程序开发者具有参考价值.关键词:网卡驱动程序;VxWorks; END;MUX中图分类号:文献标识码:A 文章编号:1006-7043 (2006)Abstract:As Embedded system are the most popular technology applied in war industry, information appliances ,it has become an important technology how to design the device drivers and implement network communications and management under embedded system. At first, this article analyzes the base principle of network driver in VxWorks and its architecture. Then it mainly illustrates how to develop the enhanced network device driver by example of Intel82557 the enhanced network driver 。

It has a reference value for other network device driver developers.Keywords:Network Driver; VxWorks; END;MUX引言VxWorks 是一个具有微内核、可裁剪的高性能强实时操作系统,它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中。

vxworks实时多任务程序设计.pdf

vxworks实时多任务程序设计.pdf

3 任务合并 .
利用任务的共同特征进行适当的任务合并 , 可以 简化系统任务模型、 减小系统复杂度、 消除某些任务 的切换开销从而减少系统的总体开销。任务合并可 分为: 根据时间一致合并 , ① 将同一事件激活的优先 级相同的函数合并在 1 个任务 中; 根据控制一致 ② 合并 , 1 将 个控制结构驱动的所有函数组合在 1 个任 务中; 根据函数一致合并 , ③ 将几个使用相同数据的 函数合并, 使原来共享的数据成为任务内的局部数 据, 从而减少互斥。
本系统运行于 V ME总线系统( ME 7) MV 17上,
通过 V ME背板总线与各模件交换数据对各处理模
系 具 优 的 术 吟 丰 的 用 件 持、 统,有 越 技 性 富 应 软 支 良
好的技术服务和可靠的系统稳定性。 V Wok 的主要性能特点有 : x rs ()高度可剪裁的微内核结构。V Wok 所需 1 x rs
的, Q I 与P SX进程级的调度策略不同, 即整个系统里
要么是优先级抢先调度, 要么是时间片轮转调度; 而 P SX标准下可以每个进程使用 自己的调度策略。 OI 系统共有 26 5 个优先级。 优先级抢先调度指的是一个优先级较低的任务 正在执行中, 另一个优先级高的任务进人就绪状态, 则马上进行处理器抢先, 执行高优先级任务, 直到高 优先级释放处理器( 完成、 、 挂起 阻塞等) 才继续执行 低优先级任务。 优先级抢先调度可以保证实时系统的迅速响应 特性, 但是也带来 1 个问题 : 当系统中存在几个相同 优先级的任务时, 就会使单一任务独占处理器, 直至 完成。为此加人了基于优先级的时间片轮转调度方 式。在不同优先级的任务间以抢先方式调度, 相同优 先级的任务则以时间片进行轮转。 () 3 存储管理 在基本的 i wn d内核中, 任务直接操作线性物理 内存, 不存在虚拟存储等复杂的存储管理策略, 这主 要是从性能来考虑的。不过 V Wok 也提供支持 x rs P SX标准的虚拟存储区和共享内存 ( OI 多处理器间 共享) 组件。 () 4 任务间通信

VxWorks下驱动程序的设计与实现

VxWorks下驱动程序的设计与实现

使 得 开 发 者 只需 做 最少 的工 作 即可 设 计 出有 效 的 、适 合 于 不 同 用 户 要求 的 系统 在 开 发 B P时 . 仅 要 对 B P专 用 的 驱 动 程 S 不 S 序 提 供完 全 的支 持 . 需 要 将 通 用 的 设 备 驱动 程序 集 成 在一 起 还 因 此 . 编 写设 备 驱 动 程 序 的 实 现 时 . 以根 据 具 体 情 况 将其 放 在 可 在 B P中 合适 的位 置 S
化 。在 V Wo s .S 向 V Wok 提 供与 硬 件 环 境 的接 口. x r 中 BP k x rs 负 责 完成 加 电时 的 硬 件初 始 化 .为 V Wok 访 问硬 件 驱 动 程 序 提 x rs 供 支 持 .将 V Wok 中 与硬 件 有 关 以 及 与硬 件 无 关 的 软 件进 行 x rs 集 成 。 B P中 , 括 了源 代 码 、 文 件 、 k 在 S 包 头 Ma e文 件 、 生 文件 以 派 及 二 进 制 驱 动程 序 模 块 。但 B P并 不 是 硬 件 驱 动 程 序 。 在 V . S x
V Wo 是 由 Wid R v r y t 公 司 开 发 的 一 套 具 有 微 x  ̄s n i s ms eS e 内核、 高性 能 、 可伸 缩 的实 时 操作 系统 , 持众 多 的 网 络协 议 . 支 用 户 可 以根 据 自己 的 需要 来 组 合 .其 开放 式 的结 构 和 对 工 业 标 准 的 支 持使 开 发 者 只 需 要 做 少 量 的 工 作 就 可 以设 计 出 有 效 的 、 适 用 于不 同 用 户 的 系统 V Wok x rs由 以下 几个 系统 组 成 : ( ) 性能 的实 时 操 作 系统 核 心 w n 。 1高 id ( ) O系 统 。V Wok 提供 了一 个 能 快 速 、 活 地 与 A S 2I / x rs 灵 NI C兼 容 的 I 系统 . 括 U I / O 包 N X标 准 的缓 冲 I / O和 P SX标 准 的 OI 异步 I / O。V Wo 包 括 以 下驱 动程 序 : 络 驱 动 、 道 驱 动 、 x As 网 管 键 盘 驱 动 、 示驱 动 、 盘 驱动 、 口驱 动 等 。 显 磁 并 ( 本 地 文 件 系 统 3)

VXWORKS的串口驱动原理和串口通信pdf

VXWORKS的串口驱动原理和串口通信pdf

关键词:Vwr 行 信 字 设 数 结 xos串 通 k 符 备 据构
VW r 是Wn i; 司 发 一 具 微 核 高 、 裁 嵌 式 时 i R e公 开 的 套 有 内 、 性能 可 减的 入 实 操 x os k d v
作系统. x o s 于成功的应用于 19 年发射的 VW r 由 k 97 火星探侧器— “ 探路者” 而闻 名。 在 高 可靠、高 性能领域被广泛应用。 x o s V w r 的优良 k 性能和 Wi R e 公司近年来在市 n ir d v 场竟 争中的上佳表现都为V w r 的 x o s 应用和进一步开发 k 提供了 有力的保证。 V w r 在具备高效实时多任务内核和良 xo s k 好可伸缩性能的同时,还支持广泛的通信协 议,并能够根据用户的需求进行组合, 其开放式的结构和对工业标准的支持,使开发者只 需做很少的工作即可设计出 有效的适合于不同用户要求的系统。V w r x o s的系统调用支持 k PS 1 3 OI 0 . X 6标准,增强了用户程序的可维护性,也为用户程序在不同 0 操作系统之间的移
程序的 编写者调用,对于串口,主要库函数有两个: L 和seL . 妙 i ec i b lt b
串口驱动程序的结构如图3 :
1 Ss m 1 yx v
De ie vc
图3 串口驱动程序的结构
tD 是串口 虚驱动程序, 一 的 tr yv 它由 些设备无关的 通用代 码构成, 个 tD 可以 一 yr v 管 理多 个串口 实驱动程序xD 和xD 所对应的串口 备. yr和t i共同 成V x r xr v v 设 tD v y b 完 O系 L
1 . 两个重要的数据结构: .1 2 驱动表 ( ret l 和设备表(ei lt Dir e v a ) b ( ve D c i) s

Vxworks嵌入式操作系统下网络设备驱动程序设计

Vxworks嵌入式操作系统下网络设备驱动程序设计

摘要:本文主要介绍在Vxworks操作系统下网络设备驱动程序设计、调试方法以及将其加入系统内核的配置方法。

关键词:Vxworks 嵌入式操作系统网络设备引言VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。

良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。

它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。

1 嵌入式系统嵌入式系统是以嵌入式计算机为技术核心,面向用户、面向产品、面向应用,软硬件可裁减的,适用于对功能、可靠性、成本、体积、功耗等综合性严格要求的专用计算机系统。

和通用计算机不同,嵌入式系统是针对具体应用的专用系统,目的就是要把一切变得更简单、更方便、更普遍、更适用;它的硬件和软件都必须高效率地设计,量体裁衣、去除冗余,力争在同样的硅片面积上实现更高的性能。

嵌入式系统主要由嵌入式处理器、外围硬件设备、嵌入式操作系统以及特定的应用程序等四部分组成,是集软硬件于一体的可独立工作的“器件”;用于实现对其它设备的控制、监视或管理等功能。

嵌入式系统应具有的特点是:要求高可靠性;在恶劣的环境或突然断电的情况下,要求系统仍然能够正常工作;许多嵌入式应用要求实时处理能力,这就要求嵌入式操作系统(EOS)具有实时处理能力;嵌入式系统中的软件代码要求高质量、高可靠性,一般都固化在只读存储器中或闪存中,也就是说软件要求固态化存储,而不是存储在磁盘等载体中。

2 设备驱动程序Vxworks5.4中驱动程序主要分为三种:字符、块以及网络驱动程序。

本文所介绍的网卡驱动程序则属于网络设备驱动程序。

2.1 网络设备驱动程序设计网络的各功能部件图1所示,网络设备驱动程序实际上是处理硬件和上层协议之间的接口程序。

VxWorks下多串口卡驱动程序设计初探

VxWorks下多串口卡驱动程序设计初探
ቤተ መጻሕፍቲ ባይዱ
序在制定的缓冲区位置进行写操作 , 与此同时还需要将数据传 送给高层协议 , 该传送过程需要使用 t y l R d()进行操作。用 户利用函数 r e a d()进行读操作的同时 ,I / 0系统会使用 函数 t y R e a d() , 将 环形 队列 的内容读 人到用 户缓 冲区 中。
行 数据 的传送 和安全 问题 的处理 。从 当前市 场发展 状况看 , 传统
清除 。
当 串 口发 现相 关 数据 后 , 会 立刻 调用 x x R c v l n t 中断服 务 程
的通 用 串 口芯 片在 数据 的接受 和 传 送上 已很 难满 足大 数 据传 送 的要 求 , 所以 , 应 考虑 使 用传 送 速 度更 高 的 串 口芯 片 。同 时针 对 标准 的 V x Wo r k s 驱动 程序不 能满 足 高速 串 口芯 片的运 行要 求 , 本 文重 点对多 通道 高速 串 口驱动 程序 的设计 进行 简单的介 绍 。
其次 , 在 实现 端 口设 置 的 同时 , 能够 保证 芯 片 和应 用程 序之 间 进行 正确 的通 讯 。
2 _ 2 设 计应 注意 的问题 2 . 2 . 1 多任 务并 发设计
为 了满 足 驱动 程 序能 够 正确 处理 并发 需 求 的要 求 , 驱 动程 序 内部 采 用 中断 所和 任 务锁 界 定对 临界 资 源 的修改 权 限 , 并 保
求 用。 1 _ 2 创 建专 用 串 口设 备
多 通道 串 口驱 动程 序 设 计 时应 满 足 以下 几 点 要求 : 首先 , 设计 工作 的开 展 应 以 O X 1 6 P C I 9 5 8串 口芯 片 为 基础 , 同 时还 应

实时操作系统VxWorks下驱动程序的设计

实时操作系统VxWorks下驱动程序的设计

信号/数据处理实时操作系统Vx Works下驱动程序的设计3周雪峰(南京电子技术研究所, 南京210013)【摘要】 介绍了Vx Works下标准I/O设备的驱动及其机理,详细说明了在实时多任务操作系统下配置PC I总线的方法。

然后以PC I设备为例,使用任务结合中断服务的方式,完成了非标准接口设备的驱动开发。

最后,阐述了实时操作系统下内存映射、DMA数据传输、中断处理和高速缓存一致性的使用方法。

【关键词】 设备驱动;中断处理;高速缓存一致性中图分类号:T N957 文献标识码:AD esi gn of D ev i ce D r i vers Ba sed on Rea l2ti m eO pera ti on Syste m Vx W orksZ HOU Xue2feng(Nanjing Research I nstitute of Electr onics Technol ogy, Nanjing210013,China)【Abstract】 The driver of a standard Vx Works I/O device as well as its working p rinci p le are intr oduced in this paper,and configurati on techniques of PC I bus in real2ti m e multitask oporating syste m are illustrated.Then take PC I device as exa mp le,a non2standard interface device driver is i m p le mented by combining tasks and interrup t service.Finally,me mory mapp ing,DMA da2 ta transfer interrup t handling and cache coherency issues in real2ti m e operating syste m design are described in detail.【Key words】 device drivers;interrup t handling;cache coherency0 引 言Vx Works嵌入式实时操作系统RT OS(Real Ti m e Operating Syste m)在军用电子通信等领域得到了广泛应用,在新型雷达的开发中需要根据相关需求定制特定的计算机外设,而第三方供应商一般只能提供W in2 dows桌面操作系统下的驱动程序,因此诸如显卡、雷达数据采集卡和网络通信板等在Vx Works下的驱动开发就显得尤为迫切。

VxWorks下驱动程序设计

VxWorks下驱动程序设计

收稿 日期 : 0 91 - 2 0 —11 5
基金项 目:陕西省 自然科学基础研究计 划项 目“ 功耗 N C的核心技 术研究 ” 编号 :0 7 2 ) 微 电子预研 专项项 目 低 O ( 20 F 1 ;
( 编号 :100 0 11 ; 电子预研重点基金项 目( 5 38 150 ) 微 编号 :10 6 17 6 ) 94 A10 00 1 作者简介 : 强新建 (99 ) 男 , 16 一 , 讲师 , 学士 , 主要从事嵌 入式 开发 与应用研究.
文章 编号 :630 4 21 )30 8-3 17 -6 X(0 0 0 - 20 0
V W ok 下 驱 动 程 序 设 计 x rs
强新建 田泽 , , 淮治华
(. 1西安石油大学 计算机学院 , 陕西 西安 7 0 6 ; . 10 5 2 中国航空计算技术研 究所 , 陕西 西安 7 0 6 ) 10 8
如 图 2所 示 ,re F T u F S由核 心 层 ( oeL yr 和 C r ae )
3个 功 能层 , 即翻 译 层 ( r s t n L yr , T 层 Ta l i a e) M D n ao
摘 要 : x rs V Wok 下设备 驱动程 序 的设计 一直是 嵌入 式 系统 应 用 中的 热点. 绍 了 V Wok 介 x rs下标 准设 备 驱 动及其 原理 , 阐述 了驱动 程序 的开发 流程 , 出 了在 Fah上 实现 Tu F S的具 体 方法 , 给 ls re F 包括驱
等方 而考 虑 , 广泛 应用定 制硬 件 , 样就要 求用 户 自 这
雾囤謇
l l l I
己开发硬件的驱动程序. 设备驱动本身与操作系统 的相关 性特别 密切 , 因此 驱 动 程序 开 发 不仅 要 求 开 发者对 操作 系统有 深 入 的 了解 , 要 对 硬 件体 系 具 还
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第 2 卷第 4 4 期
20 年 7 07 月
河 北 工 业 科 技
HeeJunl f n uta Si c n eh l y bio ra o Id s i c neadT cn o rl e o g
V l2 , o 4 o. 4 N ,
Jl 07 uy20
文章编号 :0 813 (0 70 一2 20 10一5 4 20 )40 0一3
求进或出数据包为 1 0 p(a e p s 20 sp kt e e 0p c s r-
od , P cn)且 C U占用率不高于6写。 0
本单板采用的软件平台为 Wi ivr n dRe 公司的
该函数从驱动中截获包, 口参数 u i d 人 s n ng e
ca i u hrf m为网口单元号,ni e hr, uf N u s nd。a bf指 g 向包所在地址 ,ni e hr l u s ndsote g n为包长。若处理 包成功则返回 T U , R E 否则返 回 F L E A S 。该函数 由上层应用程序提供。 函数 2 :
其作用是使 25E 859 R中断, 启动网口。按照前 文的要求修改该函数, 859R中断关闭, 将 25E 调用 函数 i A dTm rF N P Rrui ,n ag n da i e( U C T ot e it r) t n 连 接 84 定 时 器 中 断 服 务 程 序。 即 在 21 f857t t) e 25Sa (中增加以下代码: i r
12 5_ NT D S L 8 5 7 I _ IAB E;
S S I T D S B E p rCr ; _ IA L (D v t ) Y _N l
i t r i =0 ) f i it ( me n “

Ad a me ( F d Ti r ( UNC T GTckn , ) P R) ll t0 ;
基于 V wok 系统的多网口驱动程序设计 x r S
黄经元‘蔡卫平“ ,
(. 1九江职业技术学院机 电工程 系, 江西九江 3 0 ;. 2 7 3 0 2 九江职业技术学院电子 V wok 系统的多个快速以太网 P I x rs C 控制器驱动的编程方法, 出了硬件框 给 图和程序流程图, 并说明了该驱动与上层程序的接 。。
关键词 : wok ; Vx r s快速以太网; 驱动
中图分类号 : P 1 T3 9
文献标识码: A
D s no ehre nt oki ef e di rnV Wok ss m ei f tent ew r n r cs r e i x rs yt g t a v e
H A GJ g un,A Wep g U N i 一 a‘C I i i Z ny 一n
3 接 口函数
根据 以上 程 序 设计思 路, 动 除 了要 提供 驱 MU X规定的接 口函数外 , 与上层应用程序还有 2 个接 口函数。 函数 1 : u s ndca l l r u c(ni e hri hr fieF n u s ndca f ni e g Ft g - N m,nindca b f,ni e h r l ) u u s e hr关 ufu s ndsote ; g g n
v i fss n it nt c a t e d(n u i, h r, mD t , n od a aa it cu t ; o n)
V wok 操作系统[‘, x rs x rs , 〕V wok 支持 E D E - , 0 N (n hne N to Di r格式的以太网口驱动, ac e r re) d w k v 提供
的发包函数从指定网口 发出。2把 85 E ) 25 R的中 9
断关闭, 84 的定时器产生 1 1 0 次/ 的 利用 2 1 个 0 5 中断, 在中断服务程序中查询 859R的 C R 如 25E S, 果有包则调用收包函数 f857 ad R cCkn e 25H nl e l t i e v l 0。提供 2 个发包函数: 一个是 MU X规定的接 口
tn e l t 1 l l r nl 今 ;
函数 fs57ed)该函数由协议栈调用, e 25Sn(, i 另一个
是 由上 层 应 用 程 序 调 用 的 f ted( 。由于 s asn )
2 E 859R没有中断, 在这 2 个发包函数中, 都应在
发完包后调用释放 C D的函数。 F
自适应, 分别有 3K ye发送 和 3K ye接收 bt bt
FF 859 R是目 IO,25E 前功能最为强大的以太网口芯
片之一[。在 M C21 P I 8 〕 P s4 的 C 总线上挂T 3 片
万方数据
第4 期
黄经元等 基于 V wok 系统的多网口驱动程序设计 xrs
859 R, 25E 总线号 均 为 0 设 备 号 I S L分 别 为 , DE
A 1, D 7 A 1, D 6A 1, D 8 3块 芯 片分 别 记 为 ui , no t ui , n Z n l ui 。其中ui 是用来与主控板和 P t t no t C机
通信用的, 通信容量要求不大, u t,n 则是 而 n ut i i l Z
用来转发由话音信号打成的数据包, 即以太网包从 u i 进 , ui nt l 从 n Z出, t 或从 u i nt Z进, u i 从 nt l出, 要
该函数由驱动提供给上层应用程序发包, 口 人 参数 i ui为网口单元号, a ,m a 指向需 n n t t c r Dt h a 要发送的包, t on 为包长。 i 。u t n
收到包, 开中断, 在中断服务程序中调用函数 n - t e
o A )将收包工作交给任务来处理, Jb d(, 发送包的 处理过程也是类似的。该方法可靠性高, 网口不容 易断, 但效率低。在前面介绍的软硬件环境下, 经测 试, 效率只能达到数千 p , C U 占用率过 网口 s P 且 P 高, 远不能达到设计要求。究其原因, 2 其一, 有 条: 由于每收发 1 个包, P C U需要处理 2 次中断, 当包 较多时, 中断过于频繁, P C U进出中断都需要较多 时间, C U 占用率过高, 导致 P 而且进出包速率均匀 时, 每来 1 个包 C U都要处理 1 为驱动开的 P 次, b f 实际没利用上, f r ue 容易丢包。其二, 收发包都要 经过 V wo s x r 的协议栈, k 由上层应用程序用钩包 函数将包钩出来处理, 这样每个包都经历了若干个 不必要的流程, 限制了C U处理包的能力。 P 针对以上 点, 2 提出以下改进措施: 在驱动中 ) 1 截获包, 把包交给上层应用程序分析, 如果该包需要 上层处理, 则交给上层应用程序, 处理完后, 由特定
n r g pr et ii g ctnln T cn a伪lg,哟ag i e i D a m n,ua V aoaa eh c ne t J no i j d i l l eJ i j 昭范320 ,h a e i n a 307C i ) n
A s atT ipprn oue t dvf m n oe e entokn rc di rn x rs y e . t r ethr bt c:h aeir c h ee p etft r t e r iea s reiv wo ss m Ip s s a - r s td s e o hn w tfe v k t en d
w r b c i rr a Porm f w hr,n dm nt t t it ae u co s a l kd ga n rga l cata e s ae w ne c fnt n. e o a n d o d o r so f r i


w rs V wok ; hre;r e o : x rse e tdi r d t n v
(. l t m ca c ea m n, 司agV ct nln T cn a C lg,ii g i 1Ee r e 垃 D pr et ii o ao a ehi l l eJ a j 咚五320 ,h a2Ee rn E i c o h t J n i a d c o e 帕n a 307C i ;. l t i n - n co c g
基于 P w rC内核的 R S oe P IC处理器 P w rC oe o eP 63 和1 PI 个 C 总线控制器,o e C 0e P w r 63 内核速度可 P 达 20MH , 0 z内存总线 S R M 速度为 10MH , DA 0 z PI C 总线速度为 6 MH 。以太网口芯片采用 It 6 z ne l 2 E 859 R快速以太网 P 控制器 , I C 该芯片具有 3 2 b 的P I i t C 接口, 内置 MA C和 P Y 1/o H ,0l0Mbs p


为满足通信容量的要求, 以太网口的效率至关
。在选好以太网口芯片后 , 如何开发一个高效
C B PI U s
C U P Ml 2 1 ℃8 4 R 二B I US
率的驱动程序显得尤为重要, 好的驱动程序能充分
利用芯片的性能, 达到高稳定高效率的要求〔6 ,〕 一。
以太网口芯片供应商一般都会提供相应的驱动, 但 每台嵌人式系统设备对网口都有特定的要求, 尤其 是在多网口的情况下更是如此。基于 V wok 操 x rs 作系统和MP 84 的 C U, C21 P 本文提出了一种多网 口驱动程序设计方法。
8 5E 5 2 9R
8 5E 5 2 9R
85 9 R 25E
) 0 (
( 1 )
2 ( )
图 I C I 与 25E 85 9 R接 口框 图 PJ
Fg1 Bokd ga f P i e ae i 25E i . l ir c a mo C U n r c wt 59 R tf h8
相关文档
最新文档