侵权投诉
订阅
纠错
加入自媒体

实时嵌入式操作系统VxWorks设备驱动程序设计

2013-11-06 15:13
论恒
关注

  2 VxWorks设备驱动程序的设计

  为了实现应用程序的可移植性,将应用程序从直接操作硬件设备中解放出来,VxWorks操作系统为应用程序操作硬件设备提供一个一致的接口。这个接口就是由操作系统的I/O系统提供的。I/O系统将应用程序的I/O请求传递给设备专用的I/O函数。这些设备专用的I/0函数就是由设备驱动程序提供的。本章从功能、接口与结构3个角度阐述设备驱动程序的设计。

  2.1 设备驱动程序的功能

  1)对设备进行初始化 初始化的目的是使设备处于某种工作状态,以便用户程序访问该设备。

  2)打开设备操作 打开设备操作实际上是查询用户指定的设备,并查看用户是否可以使用该设备。因为设备是共享资源,当设备正在被使用时,系统要对它进行保护,禁止其他任务对设备进行操作,直到设备资源被释放。

  3)关闭设备操作 关闭设备操作就是释放设备资源。任务对设备完成操作后,必须进行关闭设备操作,否则设备总是处于被占用状态,其他任务无法使用。与打开设备操作相对应,有打开操作就应该有关闭操作。

  4)从设备上接收数据并提交给系统 这项功能通常就是所说的读操作,接收外部传输来的数据。接收数据采用的方式有查询方式、中断方式和DMA方式。

  5)把数据从主机上发送给设备 这项功能对应通常的写操作,把主机上的数据传送给外界。通常系统主动调用该操作进行数据发送,有时也采取中断方式发送数据。

  6)对设备进行控制操作 在使用设备过程中,有时根据应用的需要对设备进行控制(例如改变设备某个状态),而控制操作就能提供这种功能。

  2.2 设备驱动程序的接口

  VxWorks通用设备驱动程序基本都是通过I/O系统来存取的,这样做的好处是可以屏蔽底层硬件,对上层应用程序提供统一的接口。Vx-Works的I/O系统由基本I/O及含buffer的I/O组成,它提供标准的C库函数,基本I/O库与Unix兼容,而含buffer的I/O则与ANSI C兼容。VxWorks的I/O系统有其独特的特性,使得它比其他I/O系统更快速、灵活,这在实时系统中非常重要。还有一些特殊的通用IO设备驱动程序如串行通用IO设备驱动程序由于其自身的特性,虽然不是通过标准I/O来进行存取的,但是也都有它们各自相关的规范。下面只介绍通过I/O系统存取的通用IO设备驱动程序。

  VxWorks作为实时操作系统为了能够更快、更灵活地进行I/O操作,提供了若干库来支持标准的字符设备和块设备。一个字符设备的驱动程序和I/O系统直接作用,调用驱动程序安装函数iosDrvInstall()在VxWorks中安装驱动程序。它执行7个基本的I/O操作:create,rem-ove,open,close,read,write和ioctl。如果设备不支持某些I/O操作,则相应的程序可以被省略。iosDrvInstall()只是为驱动程序在驱动程序表中分配了一个位置,要运行驱动程序还需要调用设备安装函数iosDevAdd()。iosDevAdd()把设备名和驱动程序号写到数据结构DEV_ HDR中,并把它加到系统的设备列表中。

  一个块设备的驱动挂在文件系统上比直接挂在I/O系统上使用起来更方便。它先和文件系统作用,再由文件系统与I/O系统作用。块设备驱动程序不使用iosDrvlnstall()来安装驱动程序,而是通过初始化块设备描述结构BLK_DEV或顺序设备描述结构SEQ_DEV来实现驱动程序提供给文件系统的功能。类似的,块设备驱动程序不使用iosDevAdd()来将驱动程序装入I/O系统,而是使用文件系统设备初始化函数,如dos-FsDevInit()来完成。实际上,文件系统把自己作为一个驱动程序装到I/O系统中,并把请求转发给实际的设备驱动程序。

  2.3 设备驱动程序的组成

  设备驱动程序包括3部分:初始化部分、函数功能部分和中断服务程序ISR。

  1)初始化部分初始化硬件,分配设备所需的资源,完成所有与系统相关的设置。如果是字符设备,首先调用iosDrvInstall()来安装驱动程序,把中断向量和ISR挂上,然后调用iosDevAdd()将驱动程序加入I/O系统中;如果是块设备,首先把中断向量和ISR挂上,在内存中分配一个设备结构,然后初始化该结构。用户要使用该设备时,先调用设备初始化函数xxlnit(),再调用设备创建函数xxDevCreate(),返回一个BLK_DEV结构的指针,供文件系统初始化函数使用。

  2)函数功能部分完成系统指定的功能。对于字符设备,这些函数就是指定的7个标准的I/O函数;对于块设备,则是在BLK_DEV或SEQ_DEV结构中指定的功能函数。

  3)中断服务程序是实时系统的重要组成部分,系统通过中断机制来了解外部事件,并作出响应。实时系统的反应速度取决于系统对中断的响应速度和中断处理程序的处理速度。因此,中断服务程序的处理时间应尽量短。所有的中断服务程序共享一个堆栈,没有任务控制块,所以,在中断服务程序中不能使用可导致阻塞的函数,如printf(…)、semTake(…)等。中断服务程序中可以使用semGive(…)与其他的非中断服务程序进行通信。理想的情况,一个中断服务程序仅调用一个semGive(…)系统调用,也就是说,中断服务程序的主要功能应该是发起一个任务来完成必要的处理。为提高中断服务程序与任务的合作性能,最好的机制是信号量。

<上一页  1  2  3  下一页>  
声明: 本文由入驻维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。

发表评论

0条评论,0人参与

请输入评论内容...

请输入评论/评论长度6~500个字

您提交的评论过于频繁,请输入验证码继续

暂无评论

暂无评论

文章纠错
x
*文字标题:
*纠错内容:
联系邮箱:
*验 证 码:

粤公网安备 44030502002758号