VxWorks 环境下串口驱动程序设计

1  引 言
对于一个集管理、决策、控制及各种信息融合为一体的大系统来说,操作系统起着极其重要的作用。近年来,国内对嵌入式操作系统的研究已开始成为热点,但就大多数应用来看,还处在较为简单的发展阶段,严重地制约各种新理论、新算法的实现,而且系统鲁棒性无法有质的提高。作为一个优秀的操作系统,VxWorks 实现了比其他实时操作系统更好的有效性、商用性、可裁减性以及互操作性[ 1 ] ,广泛应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。为了实现VxWorks 对专用目标板的移植,必须编写相应的驱动程序。
2  VxWorks 系统结构及启动过程
VxWorks 由一个基于优先级中断驱动的多任务调度内核和设备管理、文件管理、网络扩展及兼容POSIX 协议的运行接口组成,通过二进制信号量、互斥信号量、计数器信号量、管道、消息等支持任务间灵活通信。
VxWorks 采用类似Unix 的进程调度算法,但是考虑到其实时性,VxWorks 采用段式或段页式管理来实现访问4GB 的逻辑空间,一般不采用虚拟内存,也即无缺页中断。专用BSP(Board Support Package) 的编写是实现系统移植的重点,BSP 主要用来完成VxWorks 对专用目标板的支持。一个BSP 包括硬件初始化、中断处理和产生、硬件时钟管理、本地和总线内存空间映射,同时也包含定制VxWorks 映像。它贯穿着硬件级、操作系统级和应用程序级3 层。按照操作系统相应规范编写对硬件的驱动,然后挂接于VxWorks 的内核中与Works 一起为应用程序级提供服务。

除了解系统结构外,为实现驱动程序的挂接,还必须了解系统的启动过程。启动过程。系统加电后首先执行驻留ROM 中的汇编代码romInit () ,完成屏蔽处理器中断,初始化内存、堆栈及寄存器,调用romStart ()完成代码重定位、解压及为ROM 映像初始化RAM。之后进入驻留于RAM_LOW_ADRS 处的VxWorks 入口程序sysInit () ,调用第一个C 程序usr Init ( ) ,完成用户定义系统的初始化工作,此时系统还处于单任务环境,其中,子程序SysHwInit () 用来初始化系统硬件,将系统硬件置于安静状态;子程序SysHwInit2 ( ) 实现系统硬件中断的挂;Kernelinit () 激活多任务环境,产生根任务usrRoot () 。该任务用来安装驱动程序、创建设备、初始化VxWorks库、调用应用程序启动代码。UsrRoot ( ) 是驱动程序的入口点,用户编写的驱动程序一般都挂接在例程usrRoot ( )
中,而BSP 专用的设备驱动程序不依赖usrRoot ( ) 中的启动功能模块的驱动程序则可以位于SysHwInit () 中。

3  VxWorks 的I/ O 系统驱动程序设计
VxWorks 支持2 种设备:块设备(Block Device) 和字符设备(Charater Device) 。其中块设备经过文件系统,字符设备不经过文件系统,如图3 所示。块设备中存储的是定长且可任意访问的数据块,该设备的I/ O 操作也是以块
为单位的。块的大小通常是512 字节或2 n 的长度。块设备有硬盘、软盘驱动器和CD - ROM 驱动器等,内核通过buf 结构与块设备打交道,这样可以封装所有I/ O 操作的细节。字符设备能够存储或者传输不定长数据。某些字
符设备可以每次传递一个字节,传完后产生一次中断,另一些设备可以内部缓存数据。内核把这些数据解译为可顺序访问的连续字节流。字符设备不能以任意地址访问,也不允许查找操作。字符设备有终端、打印机、鼠标和声卡等。
应用程序通过文件名(即设备名) 查找设备列表(De2vice List) ,返回驱动程序表中驱动程序入口索引并保存于文件描述表(File Description Table) 中(以后的读写操作将通过该表访问具体设备) 。由设备表索引查找驱动程序表
(Driver Table) ,从而得到相应的设备操作函数入口,如图4 所示。此外,对于块设备来说读写操作最后还要通过文件系统读写入口函数。编写设备驱动程序只需编写相应设备的xxCreate ( ) , xxOpen ( ) , xxDelete ( ) , xxClose ( ) ,
xxRead ( ) , xxWrite ( ) , xxIoctl ( ) 等7 个主要函数外加xxDrv() ,xxDevCreate ( ) 2 个函数就可以了。其中xxIoctl() 封装了对设备的控制,如串口波特率、停止位、校验位等的控制。XxDrv() 用来初始化驱动程序,并把7 个主要函
数装入操作系统的驱动程序表中,返回一个驱动程序号。xxDevCreate () 将所需设备的描述符的设备头装入操作系统设备的双向链表中,该表中包括设备名和相应的驱动程序号。至此完成了设备与驱动程序的挂接。应用程序可
以调用open() 等函数通过操作系统提供的这种层次访问
结构访问到相应的设备xxOpen() 等函数。

4  串口驱动的实现
以下是基于Intel 8250 芯片的串口驱动的实现过程。
具体说明如下:
(1) 定义寄存器
# define UART_THR     0 ×00
# define UART_RDR  0 ×00
# define UART_BRDL  0 ×00
# define UART_BRDH  0 ×01
# define UART_IER  0 ×01
# define UART_IID  0 ×02
# define UART_LCR  0 ×03
# define UART_MDC  0 ×04
# define UART_LST  0 ×05
# define UART_MSR  0 ×06
(2) 定义各种控制变量(仅给出IER 寄存器控制定
义)
# define I8250_IER_RXRDY    0 ×01

# define I8250_IER_TBE  0 ×02
# define I8250_IER_LST  0 ×04
# define I8250_IER_MSI  0 ×08
(3) 编写具体实现函数
I8250HrdInit () 初始化I8250 芯片,如设置波特率,初
始化通道等。
{
⋯⋯
}
I8250Int () 处理收发中断
{
⋯⋯
}
此外,还要实现I8250Open () , I8250Ioctl () 等函数,以
便最后挂接于usrRoot () 函数中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值