qnx简介

来源:互联网 发布:网络安全法细则 编辑:程序博客网 时间:2024/06/05 17:32

      单家方    匡光力

(中国科学院等离子体物理研究所10  230031

摘要: 本文介绍QNX6.20系统下设备资源管理器的运行机理和体系系统。结合PXI总线设备的体系结构,我们采用三级分离的方式开发PXI多功能采集卡的驱动程序。文章具体分析了应用程序级和硬件驱动级驱动函数的开发,重点阐述了系统调用级驱动函数的开发。

关键词: QNX  PXI  资源管理器  进程管理器  实时操作系统

The Development of the Driver of PXI

Multi-function Data Acquisition Card in QNX

HUANG Feng,  SHAN Jia-Fang,  KUANG Guang-ling

(Institute of Plasma Physics, Chinese Academy of Sciences, Hefei 230031, China)

 

Abstract:   The article introduces the system architecture and running theory of the device resource manager in QNX. Combining the system architecture of the PXI bus device, we develop the driver of PXI multi-function data acquisition card in the method of the three-level driver. In the article,we concretely analyze the development of driver function at theapplication level and the device driver level; give emphasis to thedevelopment of driver function at the system quote level.

Key words:  QNX  PXI  Process Manager   Resource Manager  Real Time OS

1   引言

QNX是一个分布式、多用户、多任务、可嵌入式的实时操作系统。被广泛应用到电信系统、航天仪器、工业自动化等方面。目前很多PXI总线的外围设备都不具备QNX下的驱动程序。要在QNX系统下应用就需要自己开发驱动程序。QNX系统下的设备驱动程序被称作为资源管理器。由于QNX微内核符合POSIX标准,QNX下设备管理函数大部分是POSIX函数。为了使微内核更具有灵活性和减少应用系统对存储器的需求,以及适应不同级别不同规模系统的应用,QNX允许用户编写特定的资源管理进程。资源管理器是为各种不同的设备提高统一的界面接口,它们管理的有真实的硬件(串口、并口等)也有虚拟的设备(/dev/null,虚拟终端等)。在其他的操作系统中这些功能经常与内核协同工作。但是在QNX系统中资源管理器不需要任何内核的安排,实际上它就是一个普通的用户级服务程序。它接收其他程序发来的消息,并且可以选择是否需要与硬件进行通信,具有强大功能和灵活性的本地IPC服务使得资源管理器从操作系统中分离出来。

2  QNX资源管理器原理

2.1 设备驱动原理

QNX资源管理器与操作系统内核的分离使得其驱动原理与其他操作系统下的设备驱动程序有所不同。在QNX下,系统用一种非常灵活的机制——名字空间分配(pathname space mapping)将资源管理器与其客户端进行绑定。资源管理器对于所要管理的资源都赋予一个特定的路径名,并向进程管理器进行注册。进程管理器起着调度资源管理器以满足客户进程请求的作用。

2.2  QNX资源管理器框架

   从功能上来分,QNX设备管理器通常由以下四层构成:

(1)       功能函数层:提供统一的功能函数。

(2)       消息接受层:接受和分析客户进程发送的请求消息

(3)       消息调度层:调度消息队列的处理。

(4)       线程管理层:管理资源管理器内的线程。

具体地说,就是资源管理器先创建一个通道(由dispatch_create ()函数实现),这样客户程序就可以连接到资源管理器并进行进一步的服务请求。然后资源管理器向进程管理器注册一个特定的名字空间(resmgr_attach()函数实现)。进程管理器根据注册的名字空间为请求操作的客户进程指派相应的资源管理器。由指派的资源管理器响应请求操作。请求操作是以消息的形式与资源管理器进行通信。消息有两大类:建立连接消息和I/O消息。在资源管理器中有两个结构(resmgr_connect_funcs_t类型和resmgr_io_funcs_t类型)分别登记了这两类消息对应的响应函数。在资源管理器初始化时,要为各种消息指定相应的响应函数。例如,为打开设备的消息指定函数:

main (int argc, char **argv)

{   

resmgr_connect_funcs_t  connect_funcs

/*install all of the default function */

iofunc_funs_init (_RESMGR_CONNECT_NFUNCS, &connect_funcs, RESMGRIO_NFUNCS, &io_funcs);

/*take over the open function */

connect_funcs.open = io_open;

}

int io_open (resmgr_context_t *ctp, io_open_t *msg , RESMGR_HANDLE_T *handle, void *extra)

{return (iofunc_open_default (ctp, msg, handle, extra) ); }

3  PXI总线系统体系结构

PXI (PCI eXtensions for Instrumentation,面向仪器系统的PCI扩展) 是一种坚固的基于PC的测量和自动化平台。PXI 的规格区分为硬件与软件两个部分。其中硬件部分是基于CompactPCI的规格,也就是PICMG 2.0。建构于CompactPCI的机构规格与PCI的电气规格之上,加上仪器上所需要的电气信号延伸,即是所谓PXI的规格。所以,PXI的数据传输速率的峰值于33MHz32-bit的总线上,可达132MB/s。于66MHz64-bit的总线上则可高达528MB/s。远高于GPIBVXI接口的传输速率。

 

1PXI系统控制图

 

PXI上的仪器延伸信号包括:(如图1所示)

110MHz 参考时脉 (10MHz Reference Clock)

28-bit PXI触发总线 (PXI Trigger Bus)

3)星形触发 (Star Trigger)

413-bit局部总线 (Local Bus)

利用PXI上延伸信号中的触发总线可达到多卡同步的功能;利用星形触发可以给其他扩充槽发送信号;利用局部总线可将控制信号一级一级地传输,或者作为区域的通信管道。

4  PXI驱动程序实现

由于PXI结合了PCI的电气总线特性并与PCI软件兼容。很多有关PCI总线操作的API函数同样可以应用到PXI总线上。本文以PXI-2010多功能数据采集卡驱动开发为例介绍在QNX如何开发PXI外围设备的驱动。PXI-2010是台湾凌华公司新研制出来的一块四通道同步A/D、两通道同步D/A高速采集卡。为了充分利用原有Linux下驱动程序原代码。PXI卡的驱动程序采用三级分离的结构。

整个驱动程序分为三级:(1)应用程序级,(2)系统调用级,(3)硬件驱动级。

4.1 应用程序级

根据各种卡具有的功能提供给用户的开发函数,它是面向用户的。主要实现多通道同步A/DD/A、多卡同步以及自动修正等功能。由于QNXLinux一样把设备看作是“设备文件”,两者的应用程序级驱动函数基本一致,都是利用系统调用函数(open 函数、close函数、devctl函数等)来实现采集卡具有的各种功能。例如,多卡同步函数:

I16 D2K_SSI_SourceConn (U16 wCardNumber, U16 sigCode)

{ DAS_IOT_SSI  iotSSI

 memset( &iotSSI, '/0', sizeof(DAS_IOT_SSI) )

 iotSSI.wSigCode = sigCode

 iotSSI.wDir = 1

 if (devctl (CurrentCard.hDevDriver, DAS_IOC_SSI_CTL, &iotSSIsizeof(iotSSI) ,NULL) < 0 )

 return (iotSSI.wErrorCode)

 return NoError }

   从代码中可见,这一级别的驱动是在应用程序中实现的。用户调用devctl函数给资源管理器发送一个devctl消息,消息类型为DAS_IOC_SSI_CTL,资源管理器从resmgr_io_funcs_t类型表中找到devctl对应的响应函数io_devct(),并传送给它消息类型和数据,调用相应的设备控制函数将采集卡连接到PXI触发总线上实现多卡同步功能。

4.2系统调用级

系统调用级驱动也就是QNX资源管理器,是面向设备文件的标准系统函数。它是应用程序级驱动函数的开发基础,也是QNX内核和应用程序之间的接口。由于QNXLinux的驱动原理有所不同,在开发QNX驱动时,这一级别的驱动是开发的主要部分。

 4.2.1  PXI资源管理器的体系结构

资源管理器的体系结构主要包括以下三部分:

(1)       服务请求通道

(2)       名字空间(路径名)

(3)       接收和处理消息队列

PXI资源管理器响应请求流程如下(如图2):

1)应用级驱动向进程管理器请求对/dev/pxi2010操作。进程管理器根据路径名将请求对/dev/pxi2010操作的进程移交给PXI资源管理器处理。

2 PXI资源管理器根据应用级驱动发送的打开设备的消息调用io_open()函数打开采集卡。

(3) 打开采集卡后,应用级驱动就可以根据需要调用devctl()函数给系统调用级驱动(资源管理器)发送控制设备消息,资源管理器接收到消息后调用io_devctl()函数来控制设备。

4)完成采集后应用级驱动调用close()函数来发送关闭设备消息,接收到消息后资源管理器同样调用io_close()函数关闭设备,并释放有关资源。

2PXI资源管理器框架图

4.2.2  关键数据结构

1)设备描述数据结构

3:多个进程打开一个资源管理器管理的不同设备示意图


由于系统调用级驱动面向的是符合POSIX标准的“设备文件”,所使用的函数也是标准的POSIX函数。在QNX资源管理器中为了描述设备,定义了三个重要的数据结构(如图3,其中上下文信息结构和加载结构定义如下:

typedef struct  _iofunc_ocb {                   typedef struct _iofunc_mount{

IOFUNC_ATTR_T   *attr;                      uint32_t       flags;

int32_t             ioflag                      uint32_t       conf;

off_t               offset;                     dev_t          dev;

uint16_t            sflag;                      int32_t        blocksize;

uint16_t            flags;                      iofuncs_funcs_t  *funcs;

} iofunc_ocb_t;                                }iofunc_mount_t;

上下文信息结构主要是指打开一个设备、文件的当前位置之类的信息;属性结构指的是具体的某个设备,例如:/dev/ser1, /dev/ser2等;加载结构指的是对于块设备文件系统而言的全局加载信息。

2)消息传送数据结构

资源管理器中的io_open(ctp, msg, handle, extra)函数和io_devctl(ctp, msg, ocb)函数中的参数是用于接收应用级驱动发送来的消息数据和返回结果。其中ctp主要含有用户的信息;msg是一个消息结构,在io_open中是io_open_t类型结构,在io_devctl中是io_devctl_t类型结构;而ocb是在open时赋于的上下文信息结构;handle是在resmgr_attach()时传进去的handle,通常指向 iofunc_attr_textra是为别类open操作准备的,通常open时,不会用到。

4.2.3  PXI资源管理器的功能模块

1)初始化设备模块

QNX系统下,完成对一个PXI设备的初始化,需要完成以下工作:

1)检查PXI总线设备是否存在。根据厂商标识码和设备标识码,利用pci_find_device()函数查找设备。

2)如果存在的话,读出配置头中的信息提供给驱动程序使用。

3)分配设备基地址、中断号等资源。读出I/O基地址后利用mmap()函数进行存储映射资源,将创建的共享内存对象中的一段内存映射到PXI卡中,以便进入这个PXI卡中。侦测出设备中断号后,将中断处理程序通过调用qnx_hint_attach()函数绑定到设备上。

4)将连接消息响应函数表和I/O消息响应函数初始化,再向进程管理器注册路径名/dev/pxi2010

PXIPCI在软件上是兼容的,因此PXI所有软件操作都是以PCI为基础的。QNX下的资源管理器是一个用户级的普通应用程序,初始化设备的工作可以在程序启动时进行。

2)打开设备模块

在这个模块里主要实现申请对设备的控制权,初始化采集卡的寄存器,设置采集卡的默认参数(采集信号范围、触发方式和触发电平、装入自动修正量等)。

3)数据读写和控制信息模块

PXI设备驱动程序可以通过resmgr_io_funcs_t 结构中的函数io_devctl(),向应用程序提供对硬件进行控制的接口。不同的操作通过消息类型来区别。不同的消息调用不同的硬件控制函数。例如上面所提到的多卡同步函数的消息类型就是DAS_IOC_SSI_CTL,其调用的硬件控制函数是DAQ2K_Set_SSI(PPCI_DEVEXT pDevExt, DAS_IOT_SSI* pSbuf)。模块框架如下:

int io_devctl(resmgr_context_t *ctp, io_devctl_t *msg, RESMGR_OCB_T *ocb) {
    int nbytes, status, previous;
    union {  data_t  data;
             int     data32; } *rx_data;
 if ((status = iofunc_devctl_default(ctp, msg, ocb)) != _RESMGR_DEFAULT) {return(status);}
    status = nbytes = 0;
    rx_data = _DEVCTL_DATA(msg->i);
    switch (msg->i.dcmd) {
    case DAS_IOC_GET_DESP :  //读取采集卡的有关信息
        … /*调用信息读取硬件控制函数*/
        break;
    case DAS_IOC_SSI_CTL:    //将采集卡连接到触发总线上
        
        break;
    case DAS_IOC_AIO_CONFIG : //进行模拟量输入输出设置
……
case DAS_IOC_SIMU_AI_PIO :  //进行多通道模拟量同步输入
         … /*调用同步输入硬件控制函数*/
default :
        return DAS_ERR_NO_FUNCTION; };
    memset(&msg->o, 0, sizeof(msg->o));
    msg->o.ret_val = status;
    msg->o.nbytes = nbytes;
    return(_RESMGR_PTR(ctp, &msg->o, sizeof(msg->o) + nbytes)); }

4)中断处理模块

PC的中断资源比较有限,只有0~15的中断号,因此大部分外部设备都是以共享的形式申请中断号的。当中断发生的时候,中断处理程序首先负责对中断进行识别,然后再做进一步的处理。 PXI资源管理器在初始化模块中侦测采集卡的中断号,并将中断处理程序进行绑定。

5)释放设备模块

释放设备模块主要负责释放对设备的控制权,释放占用的内存和中断等,所做的事情正好与打开设备模块相反。

4.3硬件驱动级

硬件驱动级函数是实际操作物理硬件的函数,主要是面向厂商板卡开发人员。在各种操作系统下硬件驱动级函数相差无几。因此可以借助厂商提供的LinuxWindows下原代码进行少量的修改就行。

5. 小结

   由于QNX是微内核,其设备驱动程序无需内核调试,适合普通开发人员开发。本文采用了三级分离驱动的方式开发PXI多功能数据采集卡的驱动程序,既可以充分发挥PXI采集卡的功能,又可以有效地利用厂商提供的Linux系统下的设备驱动函数的原代码,减少驱动程序开发的工作量。

参考文献

1QNX Neutrino Realtime Operating System System ArchitectureQNX Soft System Ltd. 2002

2QNX Neutrino Realtime Operating System Programmer’s Guide, QNX Soft System Ltd. 2002

3QNX 实时操作系统使用手册  北京领先实时科技有限责任公司   2001

4QNX  Neutrino实时编程入门 北京领先实时科技有限责任公司    2001

5QNX 驱动程序编程入门      北京领先实时科技有限责任公司   2001

6PCI eXtensions for Instrumentation Specification Revision 2.0 PXI Systems Alliance 2000

7PXI-2010 4-CH.Simultaneous.High performance Multi-function Data Acquisition Card User’s Guide, ADLINK Technology Inc.  2002

8D2K-DASK Data Acquisition Software Development Kit User’s Guide, ADLINK Technology Inc.  2002

作者简介: 黄峰  1977年生,中科院等离子体所在读博士研究生,研究方向:3.7GHz低杂波监控系统。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 千千静听多个列表合成一个了怎么办 别人用手机号注册了邮箱怎么办 微信身份信息验证未通过怎么办 快递地址填错了已经发到了怎么办 孩子威胁同学给她买东西吃怎么办 在超市买小孩米粉过期了怎么办 出口货物被海关扣了说仿牌怎么办 有一批仿牌被宁波海关查了怎么办 付了定金不想要车了怎么办 泥墙刮石灰上涂料现在刮腻子怎么办 月经最后一天同房了怎么办吃什么药 奶水太多了宝宝总是呛到了怎么办 婴儿刚吃完奶大量喷奶怎么办 我干活细致领导说我慢怎么办 怀孕初期吃了加明矾的粉皮怎么办 绿豆面黄豆面白面蒸馒头怎么办 画油画时把颜料染在衣服上怎么办 买的布衣柜少了一个管子怎么办 小2球刚好进2球怎么办 大2球刚好进2球怎么办 大球2进了2球怎么办 身上剩的几百块钱有掉了怎么办 刚买一天的手机电板有问题怎么办 宝宝长湿疹穿少了就感冒怎么办 照片跟视频被孩子删了怎么办 老公总是说一些不开心的话题怎么办 孩子沉迷手机篮球课不爱去怎么办 坐久了屁鼓会长疮怎么办 套胶的胶皮与海绵分离怎么办 换肾15天了沒尿怎么办? 妻子的绒癌怎么办?——急人! 孕妇结石掉在输尿管有血尿怎么办 吃葯时药片沾在食管臂上怎么办 八十多了膀胱癌手术复发了怎么办 尿蛋白和尿隐血2个加怎么办 小肝癌手术后两个月又复发了怎么办 膀胱癌血尿堵塞尿道和尿管怎么办 肾炎腰疼一条腿疼尿血怎么办 孕晚期尿常规检查尿蛋白高怎么办? 腰开车疼的不会动了怎么办 小孩跑完满头大汗就咳嗽怎么办