QNX驱动程序的编写.pdf_第1页
QNX驱动程序的编写.pdf_第2页
QNX驱动程序的编写.pdf_第3页
全文预览已结束

下载本文档

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

文档简介

收稿日期: 2005 - 10 - 16 作者简介:王斑(1981 ) , 男,山东烟台人,工学硕士,主要从 事嵌入式系统研究;苗克坚(1962 ) , 男,辽宁人,教授,主要 从事并行与分布计算的研究。 QNX驱动程序的编写 王 斑,苗克坚 (西北工业大学 计算机学院,陕西 西安 710072) 摘要:简要介绍了QNX的特点,论述了QNX下资源管理器和设备驱动程序的关系,在此基础上,详细阐 述了QNX驱动程序编写的特点以及一般步骤。 关键词:QNX;资源管理器;设备驱动程序 中图分类号: TP393 文献标识码:B 文章编号: 1000 - 8829 (2006) 06 - 0054 - 03 Programm ing Device Driver for QNX OS WANG Ban, M I AO Ke2jian (Institute of Computer Science,Northwestern PolytechnicalUniversity, Xian 710072, China ) Abstract:The characteristics ofQNX and the relation between resource managers and device drivers are intro2 duced. On the basisof this, the characteristicsof programming device driverofQNX are analysed and a general method of programming device driver ofQNX is given. Key words:quantum software systems(QNX); resource manager; device driver 1 QNX介绍 QNX是一个分布、 嵌入式,可规模扩展的微内核 实时操作系统。 首先,QNX是一个实时系统。实时系统最重要的 特点就是实时性,即系统的正确性不仅依赖于计算结 果的正确性,还取决于输出结果的及时性。 再者,QNX是一个标准的分布式系统,支持不同 结点间的分工合作与资源共享。 其次,QNX的内核仅提供4种服务:进程通信、 进 程调度、 中断处理和底层网络通信。因此内核非常小, 运行速度极快。用户可以很容易对它进行开发扩展以 实现自己的实际需求。 2 设备驱动程序与资源管理器 在QNX中设备被通称为资源,所有的资源都由资 源管理器管理,QNX的资源管理器负责给不同类型的 设备提供一个接口。这种设备可能是真正的硬件设备 或者是虚拟设备。其他操作系统中,这一功能是与设 备驱动程序相关的。但是QNX的资源管理器与设备 驱动程序不同的是它以独立于内核的进程来运行,使 之就像一个普通的应用程序。除此之外,二者并没有 本质的区别,所以在以下介绍中,驱动程序和资源管理 器两个概念可以混合使用。 3 QNX驱动程序的特点 QNX的驱动程序是开放型的,没有什么特定的框 架和模式。驱动程序的根本目的就是实现硬件和应用 程序的交互。QNX对硬件的操作非常方便快捷,只要 通过系统命令pci2v就可以查找到硬件的端口,所以, 用户甚至可以跳过驱动直接对硬件进行操作,这对于 用户来说是非常方便的。QNX也提供了资源管理器 来支持驱动,用户可以编写自己的命令来控制硬件。 4 QNX驱动程序的编写 驱动程序的编写主要包括以下几个方面: 设备初始化和释放。 把数据从内核传送到硬件和从硬件读取数据。 读取应用程序传送给设备文件的数据和回送应 用程序请求的数据。 检测和处理设备出现的错误。 从以下几个方面来介绍QNX驱动程序编写的步 骤: (1)设备的硬件资源管理和分配。 首先在驱动程序要用到的硬件资源主要包括内 存、I/O端口和中断,如果用到DMA控制器的话,还要 有DMA通道。 45 测控技术 2006年第25卷第6期 1994-2010 China Academic Journal Electronic Publishing House. All rights reserved. 一个线程如果想要对端口进行I/O操作,它必须 具有适当的权限,必须调用这个函数来保证线程可以 访问I/O端口。 ThreadCtl(_NTO_TCTL_I O, 0) ; 如果不调用这个函数,系统就会对其提供默认的 保护而使用户无法访问。 得到权限之后,还必须通过mmap_device_io ( )进 行I/0地址的映射,只有这样才能获取设备的I/O资 源。 在QNX中提供了丰富的PCI操作函数,可以自动 的查找资源,读写PCI配置寄存器。 下面简要分析程序中的关键部分: pci_attach() ; 将程序连接到PCI server上,使得整个程序可以使用QNX 系统提供的pci_3()函数。 do iRet = pci _ find _ device (Deviceid, Vendorid, index + + , if( iRet = = PCI_SUCCESS) then找到设备; while( iRet!= PCI_DEV ICE_NOT_FOUND) ; if( iRet!= PCI_SUCCESS) then不能找到设备; 查找PCI设备,使用pci_find_device,传给该函数 两个主要参数:设备号和厂家号,并遍历查找所有的 PCI插槽,直到匹配为止。找到设备以后可以利用pci _attach_device()函数把pci_dev_info ( )与设备连接, 然后读出内存与端口的基地址和中断资源,为日后的 操作做准备。 (2)建立与资源管理器的交互机制并初始化消息 处理函数。 dispatch_create ( )函数实现了用户函数与资源管 理器的交互。通过这个函数资源管理器可以作为服务 器为用户函数提供消息分发。 QNX为驱动程序开发者提供了可靠的默认处理 函数,但是用户也可以根据需要定义自己的消息处理 函数,以io_devctl为例: iofunc_func_init(_RES MGR_CONNECT_NFUNCS, io_funcs . devctl = io_devctl; / /用户将使用自己的io_devctl 处理函数。 (3)设备驱动程序与应用程序的接口。 驱动程序不但要完成对硬件的操作,还要与操作 系统进行数据的传输,在驱动程序加载以后,用户程序 就可以像操作文件一样操作设备,比较简单快捷的方 法是使用devctl()作为应用程序与驱动程序的接口。 devctl()函数的格式是: devctl( int fd, int dcmd, void3data, size_t nbytes, int3return _info) ; 下面的值直接映射_I O_DEVCTL消息本身: struct _io_devctl uint16_t type; uint16_t combine_len; int32_t dcmd; int32_t nbytes; int32_t zero; struct _io_devctl_reply uint32_t zero; int32_t ret_val; int32_t nbytes; int32_t zero2; typedef union struct _io_devctl i; struct _io_devctl_reply o; io_devctl_t; 对于大多数资源管理器消息来说,定义的联合包 括输入结构(发送给资源管理器)和输出结构(发送回 客户端)。Io_devctl处理函数的参数说明如下: io_devctl_t3msg:指向包含消息的联合。 type:值为_I O_DEVCTL。 combine_len:只对混合消息有意义。 nbyte:是传递给devctl()函数的,这个值包含传递 给驱动程序的数据的大小,或从驱动程序接受的 数据的最大值。 dcmd:传递给devctl()函数的,这个命令是使用定 义在的宏形成的。 如上面的结构体所示,上层的用户,把要与设备驱 动程序通信的数据填入结构体中,再由系统进行重新 的解析,以消息的方式传给底层驱动程序,驱动程序再 把消息中的功能号和要传递的参数取出使用。 下面是_ I O _DEVCTL消息的处理函数的关键代 码: int io_devctl( resmgr_context_t3ctp, io_devctl_t3msg, RES MGR_OCB_T3 ocb) union data_t data; int data32; 3rx_data; if( ( status = iofunc_devctl_default ( ctp, msg, ocb) ) != _ RES MGR_DEFAULT) return( status) ; rx_data = _DEVCTL_DATA (msg - i) ; / /从消息中取得数 据结构 /3 以下就是一个使用devctl的操作,完成从驱动程序取 一些数据传给应用程序中;3/ s witch(msg - i . dcmd) caseMY_DEVCTL_GETVAL: rx_data - data32 = global_integer; nbytes = sizeof( rx_data - data32) ; break; default: 55QNX驱动程序的编写 1994-2010 China Academic Journal Electronic Publishing House. All rights reserved. return(ENOSYS) ; /3 表明返回的字节数,并返回 3/ msg - o. nbytes = nbytes; return(_RES MGR_PTR ( cpt, 还有一些需要说明:被传递的数据直接跟在io_ devctl_ t结构的后面,可以使用宏_DEVCTL _DATA (msg - i)得到这个位置的指针。不过这并不适用于 大的数据消息,在这种情况下,可以使用resmgr_ms2 gread()从客户程序中读取消息。 被返回到客户程序的数据被放在回答消息中,这 和输入数据的机制是相同的,所以使用_DEVCTL_DA2 TA ()函数来得到这个位置的指针。 (4)返回与回答的方法。 从处理函数返回到设备驱动程序库有许多方法, 不过这过程比较复杂,需要填写正确的结构,以下介绍 几种方法: 返回错误:使用return (ENOMEM)的格式,这种 格式同样可用在像read()这样的函数,至于返回的错 误号在中有相应的解释。 有时需要返回一个数据头跟着N个缓冲区,使 用的缓冲区根据每次不同的回答不同,这是需要使用 一个I OV数组,用这个数据的元素指针指向数据头和 数据缓冲区。下面的例子是变量i包含要返回的缓冲 区的偏移量。在_RES MGR_NPARTS(2)中的2告诉驱 动程序库有多少元素要返回。 my_header_t header; a_buffer_t buffersN ; . SETI OV ( SETI OV ( return(_RES MGR_NPARTS(2) ) ; 返回成功但并不包含数据, return (EOK)或re2 turn(_RES MGR_NPARTS(0) )。 返回一个包含数据的缓冲区,这也是在系统中 使用最多的一种方法,可以使用两种方法: return(_RES MGR_PTR (ctp, buffer, nbytes) ) ; 和SETI OV (ctp - iov, buffer, nbytes) ; return(_RES MGR_NPARTS(1) ) (5)设备的中断处理。 因为设备的端口和内存资源已经映射到了系统 中,所以只需使用相应的函数就可以完成读写。在 QNX中提供了许多库函数来支持驱动程序的开发,传 统的方法是把ISR过程和一个I RQ捆绑起来,但是由 于ISR的上下文切换而影响到实时性。下面介绍一种 比较实时的方法,由于实时性的要求,事先把一个事件 的结构和一个I RQ捆绑起来,这样系统停留在中断里 的时间就会缩短,所以在驱动程序中绑定一个中断注 册程序,由它来创建一个线程,并把中断的信息传递给 线程,由该线程来处理中断事务。这样就可以保证系 统能够很快地响应中断,又不会长时间驻留于中断处 理程序而不响应其他的中断。 下面分析具体的细节: if( (mypcip - chid =ChannelCreate(_NTO_CHF _D ISCONNECT | _NTO _CHF_UNBLOCK) ) = = - 1) then报错处理; if( (mypcip - coid =Connect Attach(0, 0,mypcip - chid, 0, _NTO_SI DE_CHANNEL) ) = - 1) then报 错处理; 填写必要的属性结构体如事件: if( (mypcip - iid = Interrupt AttachEvent(mypcip - int_line, if ( EOK!= pthread _ create ( 以上是函数register_interrupt()中的主体部分,说 明如下: 创建一个接收消息和脉冲信号的通道,并实现 将它与线程的绑定。 将该通道与调用它的线程连接起来,通过参数 mypcip - chid指向通道,实现连接。 进行一系列的初始化后,通过内核调用函数In2 te

温馨提示

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

评论

0/150

提交评论