嵌入式设备的驱动方法

文档序号:6551543

专利名称::嵌入式设备的驱动方法
技术领域
:本发明涉及嵌入式系统、实模式操作系统和保护模式操作系统,尤其涉及在实模式和保护模式操作系统中嵌入式设备的驱动方法。
背景技术
:嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪的专用系统,其对功能、可靠性、成本、体积、功耗有严格要求。它一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用程序等四个部分组成,用于实现对其他设备的监控或管理等功能。嵌入式系统中的外围硬件设备即嵌入式设备,既可以是集成在微处理器上的某个通信端口,如PowerPC(增强型嵌入式处理器)的FCC(快速通信控制器)、SCC(串行通信控制器)、SMC(串行多通道通信控制器),或DSP(数字信号处理器)的MCBSP(多通道缓冲串口);也可以是由微处理器控制的外围芯片,如ATM(异步传输模式)交换芯片,CAN(局域网控制器)总线控制器、VoiceCodeC(语音编解码)芯片等。对嵌入式设备的驱动主要由驱动模块进行,驱动模块主要完成两个功能其一是在应用程序和嵌入式设备之间进行控制信息的传递,其二是在应用程序和嵌入式设备之间进行数据的传递,使得应用程序可以使用嵌入式设备的各项功能。驱动模块向应用程序提供接口函数,这些接口函数通常对应于嵌入式设备具有的功能,应用程序通过调用接口函数将使用某项功能所需的控制信息和/或数据传递给驱动模块;驱动模块将这些控制信息和/或数据通过操作系统传递给嵌入式设备。对应于不同类型的操作系统,驱动嵌入式设备的方法也有所区别。操作系统属于系统软件的范畴,它以有效合理的方式管理计算机的软硬件资源,组织计算机的工作流程,控制程序的执行并向用户提供各种服务。操作系统又可以进一步划分为通用操作系统(GOS)和实时操作系统(RTOS)。通用操作系统运行在保护模式下,如Windows、Linux等,其用户界面友好,开发工具丰富,特点是最大限度利用系统资源和公平对待所有的系统请求。实时操作系统运行在实模式下,如VxWorks、OSE等,一般工作在PowerPC、DSP等嵌入式微处理器上,快速多任务切换、抢占式任务调度是其基本特点,常常用作嵌入式系统的操作系统。在实模式操作系统中,用户可以采用自定义的接口通过驱动模块与设备进行交互。因此在现有技术中,对实模式操作系统中嵌入式设备的驱动方法为驱动模块通过操作系统与嵌入式设备进行控制信息和数据的交互,同时向应用程序提供自定义的接口函数,应用程序通过调用这些接口函数实现控制信息和数据的传递。实模式下计算机系统的层次结构如图1所示,其中驱动模块工作在VxWorks、OSE操作系统与应用程序之间,与应用程序之间通过自定义的接口进行交互,同时直接使用操作系统的API(ApplicationProgramInterface,应用程序接口)函数与操作系统进行交互。这样的驱动方法使用户具有非常大的自由度,应用程序与驱动模块之间的接口都由用户自主定制。由于不同的驱动开发人员往往提供不同的与嵌入式设备的接口,导致在VxWorks上开发的驱动模块和使用该驱动模块的应用程序在OSE上无法使用。而且,即使是相同的实模式操作系统上,一个用户开发的应用程序通常也无法和其他用户开发的驱动模块一起使用。在保护模式操作系统中,应用程序工作在用户态,在用户态CPU(中央处理器)禁止对硬件的直接访问和对内存的未授权访问,对嵌入式设备的直接访问需要在内核态进行。现有技术中,对保护模式操作系统中嵌入式设备的驱动方法为将嵌入式设备虚拟成操作系统可以识别的字符设备、块设备或是网络设备在操作系统里登记注册,驱动模块工作在内核态以实现与嵌入式设备的控制信号和数据传递;驱动模块与应用程序之间必须采用操作系统在用户态和内核态之间的接口,因此驱动模块遵循操作系统为虚拟设备制定的接口为应用程序提供接口函数,并将这些接口函数与虚拟设备一同在操作系统里登记注册;由应用程序通过系统调用陷入内核态来调用上述接口函数,来进行与驱动模块之间控制信息和数据的传递。图2所示为保护模式下计算机系统的层次结构,驱动模块工作在Windows或Linux的内核态,应用程序工作在用户态,必须通过Windows或Linux系统调用陷入内核态来访问驱动模块提供的接口函数,从而使用嵌入式设备。由于不同保护模式操作系统的内核态具有非常大的差异,为嵌入式设备在一种保护模式操作系统中开发的驱动模块无法在另一种保护模式操作系统中使用。虽然不同的保护模式操作系统提供用户态接口函数差别不大,但是保护模式操作系统为内核态驱动模块提供的字符设备接口函数、块设备接口函数、网络设备接口函数这三类函数却很不同,因而只有当嵌入式设备在不同的保护模式操作系统虚拟成同样类型的设备时,涉及嵌入式设备的应用程序才具有一定程度的可移植性。而且,在保护模式操作系统下,应用程序通过系统调用陷入内核态来访问驱动模块,会引起用户态和内核态的频繁切换,影响实时性。
发明内容本发明要解决的技术问题是现有技术中,在实模式操作系统中嵌入式设备的驱动模块和涉及嵌入式设备的应用程序不能移植;在保护模式系统中驱动模块不能移植,涉及嵌入式设备的应用程序移植性和实时性差。本发明所述保护模式操作系统中嵌入式设备的驱动方法包括以下步骤A)将不同操作系统的应用程序接口API封装为统一的操作系统抽象接口函数;B)将嵌入式设备登记为操作系统支持的虚拟设备,建立所述虚拟设备的内核态内存空间与驱动模块的用户态内存空间之间的映射;C)所述驱动模块调用所述操作系统抽象接口函数,通过内存映射启动所述嵌入式设备;D)应用程序调用驱动模块和操作系统的接口函数,通过内存映射与嵌入式设备进行控制信息和/或数据的交互;E)所述驱动模块调用所述操作系统抽象接口函数,通过内存映射关闭所述嵌入式设备。优选地,所述步骤B)与步骤C)之间包括BC)向操作系统登记所述虚拟设备的异步通知函数,用来在嵌入式设备产生中断时向所述驱动模块发送所述中断的实时信号。优选地,所述步骤A)与步骤B)之间包括AB)所述驱动模块为应用程序提供统一的驱动抽象接口函数;步骤D)所述驱动模块的接口函数为所述驱动抽象接口函数;所述操作系统的接口函数为所述操作系统抽象接口函数。优选地,所述驱动抽象接口函数包括打开设备函数和关闭设备函数,其中打开设备函数用来启动对嵌入式设备的访问;关闭设备函数用来结束对嵌入式设备的访问;所述步骤BC)与步骤C)之间包括应用程序调用打开设备函数通知驱动模块对嵌入式设备进行访问,并向驱动模块指定嵌入式设备的工作状态;所述步骤D)与步骤E)之间包括应用程序调用所述关闭设备函数通知所述驱动模块结束对所述嵌入式设备的访问。优选地,所述驱动抽象接口函数还包括输入输出控制函数,用来进行与嵌入式设备的控制信息的交互;所述步骤D)包括应用程序向嵌入式设备发送控制信息的过程,具体为应用程序调用所述输入输出控制函数将控制信息发送至驱动模块;驱动模块通过内存映射将控制信息写入嵌入式设备的寄存器。所述步骤D)包括应用程序从嵌入式设备读取控制信息的过程,具体为应用程序调用所述输入输出控制函数通知驱动模块读取嵌入式设备的控制信息;驱动模块通过内存映射读入嵌入式设备寄存器中的控制信息,并向应用程序返回该控制信息。优选地,所述操作系统抽象接口函数包括任务管理类函数,用来创建、删除从嵌入式设备接收实时信号的任务;步骤C)具体为驱动模块调用所述任务管理类函数创建从嵌入式设备接收实时信号的任务,并根据应用程序的指定通过内存映射设置嵌入式设备的工作状态;步骤E)具体为驱动模块调用所述任务管理类函数删除从嵌入式设备接收实时信号的任务,停止嵌入式设备,并解除所述内存映射。优选地,所述操作系统抽象接口函数还包括内存管理类函数,用来创建、删除内存池,从内存池中分配内存,将内存归还给内存池;所述驱动抽象接口函数还包括发送数据函数,用来向嵌入式设备发送数据;所述步骤D)包括应用程序向嵌入式设备发送数据的过程,具体为应用程序将数据拷贝到调用所述内存管理类函数分配的发送缓冲区中;应用程序调用所述发送数据函数将所述发送缓冲区的指针传递给驱动模块;驱动模块将发送缓冲区中的数据通过内存映射拷贝到嵌入式设备的缓存中。优选地,所述操作系统抽象接口函数还包括实时信号管理类函数和消息管理类函数,其中实时信号管理类函数用来创建、删除、等待和释放实时信号;消息管理类函数用来创建、删除消息队列,将消息发送到消息队列,从消息队列中接收消息;所述驱动抽象接口函数还包括接收数据函数,用来从嵌入式设备接收数据;所述步骤D)包括应用程序从所述嵌入式设备接收数据的过程,具体为D1)驱动模块调用实时信号管理类函数创建并等待实时信号;D2)操作系统根据嵌入式设备的中断调用所述异步通知函数产生实时信号发送至驱动模块;D3)驱动模块通过调用所述消息管理类函数通过内存映射将嵌入式设备中的数据传送至应用程序。优选地,操作系统根据产生中断的嵌入式设备调用异步通知函数产生对应于所述嵌入式设备的实时信号,并将所述实时信号发送至所述嵌入式设备的驱动模块。优选地,所述步骤D3)具体为驱动模块调用所述消息管理类函数发送消息通知应用程序接收数据;应用程序调用所述内存管理类函数分配接收缓冲区,调用所述接收数据函数将接收缓冲区的指针传递给驱动模块;驱动模块通过内存映射将嵌入式设备缓存中的数据拷贝到应用程序指定的接收缓冲区。优选地,所述步骤D3)具体为驱动模块调用内存管理类函数分配接收缓冲区,并通过内存映射从嵌入式设备的缓存中将数据拷贝到接收缓冲区中;驱动模块调用消息管理类函数将接收缓冲区中的数据作为消息的净荷送往应用程序的消息队列。优选地,所述驱动抽象接口函数还包括复位设备函数,用来重新启动对嵌入式设备的访问;所述步骤D)包括应用程序复位嵌入式设备的过程,具体为应用程序调用所述复位设备函数通知驱动模块复位对嵌入式设备的访问;驱动模块清空嵌入式设备的缓存和未处理的实时信号。优选地,所述操作系统抽象接口函数还包括互斥锁管理类函数,用来创建、删除、等待和释放互斥锁;所述驱动方法还包括驱动模块在使用嵌入式设备的资源前,调用所述互斥锁管理类函数获得互斥锁对要使用的临界资源加锁;驱动模块使用完嵌入式设备的资源后,调用所述互斥锁管理类函数释放互斥锁。本发明还提供了一种实模式操作系统中嵌入式设备的驱动方法,包括以下步骤a)将不同操作系统的应用程序接口API封装为统一的操作系统抽象接口函数;b)驱动模块调用所述操作系统抽象接口函数启动嵌入式设备;c)应用程序通过调用驱动模块和操作系统的接口,与嵌入式设备进行控制信息和/或数据的交互;d)驱动模块调用所述操作系统抽象接口函数停止嵌入式设备。优选地,所述步骤a)与步骤b)之间包括ab)所述驱动模块为应用程序提供统一的驱动抽象接口函数;步骤c)所述驱动模块的接口函数为所述驱动抽象接口函数;所述操作系统的接口函数为所述操作系统抽象接口函数。本发明通过在操作系统抽象层中将原本提供给应用程序使用的操作系统抽象接口函数也提供给驱动模块使用,即驱动模块工作在操作系统操作层之上,使得驱动模块能够不经改动在不同的实模式操作系统上移植;而只需对在内核态登记的函数进行少量改动即可在保护模式操作系统上移植,并且能够有效减少用户态和内核态的切换次数,提高计算机系统的运行效率;同时,通过令驱动模块向应用程序提供统一的驱动抽象接口函数,使得应用程序不经改动即可在各种不同的操作系统上移植。图1所示为现有技术中实模式操作系统的嵌入式设备驱动结构图;图2所示为现有技术中保护模式操作系统的嵌入式设备的驱动结构图;图3所示为现有的操作系统抽象层的应用示意图;图4所示为实模式操作系统中本发明所述方法的流程图;图5所示为本发明所述实模式操作系统的嵌入式设备驱动结构图;图6所示为保护模式操作系统中本发明所述方法的流程图;图7所示为本发明所述保护模式操作系统的嵌入式设备驱动结构图。具体实施例方式在图1和图2中,应用程序与操作系统之间都包括操作系统抽象层。操作系统抽象层为应用程序提供统一的API函数,以屏蔽各种不同的操作系统提供的API函数之间的差异性,使得应用程序可以不经改动而适用于不同的操作系统。操作系统抽象层将多种操作系统提供的任务管理类、消息队列管理类、调试信息输出类等API函数进行分析研究,提取出完成类似功能的函数所具有的共性,根据其共性制定出统一的封装方案。例如,在VxWorks操作系统中,使用如下API函数来创建任务inttaskSpawn(charname,/*任务名*/intpriority,/*任务优先级(0-255),0优先级最高*/intoptions,/*任务选项,如是否支持浮点、是否允许设置断点等*/intstackSize,/*堆栈大小*/FUNCPTRentryPt,/*任务入口函数*/Intarg1...arg10,/*任务入口函数的10个输入参数*/)在OSE操作系统中使用如下API函数来创建任务PROCESScreate_process(PROCESS_TYPEproc_type,/*任务类型优先级、中断任务*/Char*name,/*任务名*/OSENTRYPOINTentrypoint,/*任务入口函数*/OSADDRESSstack_size,/*堆栈大小*/OSPRIORITYpority,/*任务优先级(0-31),0优先级最高*/OSTIMEtimeslice,/*保留参数,不使用*/PROCESSblock,/*保留参数,不使用*/structOS_redir_entry,*route_table,/*保留参数,不使用*/OSVECTORvector,/*中断向量,创建中断任务时使用*/OSUSERuser,/*保留参数,不使用*/)美国IEEE(InstituteofElectrical&ElectronicEngineers,电气与电子工程师协会)协会制定的POSIX(PortableOperatingSystemInterfaceforcomputerEnvironments,便携式计算机环境操作系统接口)标准是操作系统抽象层的一种,通过下述创建线程的方法来实现对上述两种操作系统创建任务的封装pthread_attr_init初始化线程属性;pthread_attr_setschedpolicy设置线程调度策略(FIF0、RR);pthread_attr_setschedparam设置线程调度参数(优先级(1-99),99优先级最高);pthread_create创建线程。但遗憾的是,部分遵循POSIX标准的API函数使用起来过于复杂,并未得到用户的广泛认可。而套接字socket、文件管理系统FMS、ANSI(美国国家标准化组织)C的一些标准库,则已经形成标准通用于各种操作系统,可直接使用。目前,许多公司都是自行开发操作系统抽象层来对其应用程序支持的操作系统进行封装,请参阅图3,应用程序通过调用操作系统抽象层提供的统一的封装接口,进行与操作系统之间的信息和数据传输,这样应用程序可以通用于多种不同的操作系统。为了实现驱动模块在不同操作系统间的移植性,本发明的思路是使驱动模块工作在操作系统抽象层之上。在实模式操作系统中,本发明所述嵌入式设备驱动方法的流程如图4所示。在步骤S110,将不同操作系统的API封装为统一的操作系统抽象接口函数。即提取出不同操作系统的API所具有的共性,并根据其共性制定出操作系统统一的封装接口操作系统抽象接口函数。可见,本发明中操作系统抽象接口函数是前述操作系统抽象层的组成部分。驱动模块使用的这些操作系统抽象接口函数包括任务管理类函数用来创建、删除任务。具体而言,驱动模块使用该类接口创建、删除嵌入式设备的中断处理任务;内存管理类函数用来创建、删除内存池,从内存池中分配内存,将内存归还给内存池。具体而言,驱动模块使用该类接口操作与嵌入式设备进行数据交互的缓存,实现静态内存动态使用的目的;信号量管理类函数用来创建、删除、等待和释放信号量。具体而言,当嵌入式设备产生中断后,使用该类接口以信号量的形式通知驱动模块该嵌入式设备产生了中断。驱动模块将进行中断处理,例如如果是接收中断,则通知应用程序接收数据;如果是告警中断,则通知应用程序设备故障;消息管理类函数用来创建、删除消息队列,将消息发送到消息队列,从消息队列中接收消息。应用程序通过接收来自操作系统的消息来对设备的要求进行响应,驱动模块需要通知应用程序进行与嵌入式设备有关的操作时,则需要通过操作系统向其发送相应的消息;互斥锁管理类函数用来创建、删除、等待和释放互斥锁,进行对嵌入式设备的互斥操作。在支持多任务的操作系统中,当一个任务使用某一个资源时,其他任务如果同时对该资源进行操作,往往会导致不可预见的后果。解决这一问题的方法是采用互斥锁,当一个任务需要排他性的使用某个资源时,则在该资源上加锁,直至使用完毕后解锁,以保证在其使用期间不被其他任务干扰。当一个任务要使用的资源被其他任务加锁时,只能等到该资源被解锁后才能使用。在步骤S120,令驱动模块为应用程序提供统一的驱动抽象接口函数。驱动抽象接口函数可以根据具体的嵌入式设备的使用方法来确定。综合应用程序对嵌入式设备通常的使用方法,驱动抽象接口函数一般会包括下述函数打开设备函数用来启动对嵌入式设备的访问;关闭设备函数用来结束对嵌入式设备的访问;复位设备函数用来重新启动对嵌入式设备的访问;发送数据函数用来向嵌入式设备发送数据;接收数据函数用来从嵌入式设备接收数据;输入输出控制函数用来进行与嵌入式设备的控制信息交互。在步骤S130,应用程序调用打开设备函数通知驱动模块对嵌入式设备进行访问,并向驱动模块传递嵌入式设备的工作参数。打开设备函数同时向驱动模块指定应用程序所要求的嵌入式设备的工作状态。在步骤S140,驱动模块启动嵌入式设备。驱动模块调用任务管理类函数创建嵌入式设备的中断处理任务。同时,驱动模块根据应用程序指定嵌入式设备的工作状态对嵌入式设备进行相应的配置。在步骤S150,应用程序调用操作系统抽象层提供的操作系统抽象接口函数和驱动抽象接口函数,与嵌入式设备进行控制信息和/或数据的交互。事实上,应用程序向嵌入式设备发送控制指令,而从嵌入式设备读取的是其状态信息,在本发明中,为描述简便起见,将嵌入式设备的状态信息也称之为控制信息。本步骤实际上是应用程序使用嵌入式设备的具体过程,在这一过程中应用程序可能进行发送数据、接收数据、发送控制信息、读取控制信息、复位嵌入式设备等中的一项或数项工作,以下分别介绍每项工作的具体执行步骤。应用程序向嵌入式设备发送数据的过程为应用程序调用操作系统抽象层提供的内存管理类函数从其占用的内存池中分配发送缓冲区;应用程序将数据拷贝到发送缓冲区;应用程序调用发送数据函数将发送缓冲区的指针传递给驱动模块;驱动模块将发送缓冲区中的数据拷贝到嵌入式设备的缓存中,由嵌入式设备根据应用程序的控制信息对数据进行处理;待数据拷贝完毕后,驱动模块调用内存管理类函数将发送缓冲区归还到应用程序的内存池中。应用程序从嵌入式设备读取数据的过程为驱动模块调用信号量管理类函数创建并等待信号量;嵌入式设备产生中断,操作系统调用登记的中断服务程序入口,清空中断,产生信号量发送至驱动模块的中断处理任务;中断处理任务获得了信号量后,由驱动模块将嵌入式设备中的数据传送至应用程序。驱动模块有两种方式实现这一过程第一种是以消息的形式通知应用程序取走数据;第二种是直接将从嵌入式设备接收的数据作为消息的净荷送往应用程序的消息队列。采用上述第一种方式的具体流程如下驱动模块调用消息管理类函数通过操作系统发送消息通知应用程序接收数据;应用程序收到通知消息后,先调用内存管理类函数从所占内存池中分配接收缓冲区,再调用接收数据函数将接收缓冲区的指针传递给驱动模块;驱动模块从嵌入式设备的缓存中将数据拷贝到应用程序指定的接收缓冲区中;应用程序对接收数据处理完毕后调用内存管理类函数将接收缓冲区归还到其内存池中。采用上述第二种方式的具体流程如下驱动模块调用内存管理类函数从所占内存池中分配接收缓冲区;驱动模块从嵌入式设备的缓存中将数据拷贝到接收缓冲区中;驱动模块调用消息管理类函数将接收缓冲区中的数据作为消息的净荷送往应用程序的消息队列;应用程序对接收数据处理完毕后调用内存管理类函数将接收缓冲区归还到驱动模块的内存池中。是采用第一种方式,还是第二种方式取决于应用需求。两者的区别是采用第一种方式,应用程序分配接收缓冲区,驱动模块提供数据接收函数;采用第二种方式,驱动模块分配接收缓冲区,并且不需要提供数据接收函数。应用程序向嵌入式设备发送控制信息的过程为应用程序调用输入输出控制函数将控制信息发送至驱动模块;驱动模块将控制信息写入嵌入式设备的控制寄存器。应用程序从嵌入式设备读取控制信息的过程为应用程序调用输入输出控制函数通知驱动模块读取嵌入式设备的控制信息;驱动模块读入对应嵌入式设备的控制信息,并向应用程序返回该控制信息。在应用程序对嵌入式设备的使用过程中,如果嵌入式设备发生异常,或者应用程序需要打断嵌入式设备正在进行的工作时,则需要复位嵌入式设备。具体过程为应用程序调用复位设备函数通知驱动模块复位对嵌入式设备的访问;驱动模块清空嵌入式设备的缓存。应用程序可以根据实际需要,进行多次与嵌入式设备之间的控制信息和/或数据的交互。换言之,上述各个过程可以交叉重复进行。在步骤S160,当应用程序不再使用嵌入式设备时,调用关闭设备函数通知驱动模块结束对嵌入式设备的访问。在步骤S170,驱动模块停止嵌入式设备。驱动模块调用任务管理类函数删除嵌入式设备的中断处理任务。对于支持并行多任务的操作系统,在驱动模块使用可能与其他任务发生并行访问冲突的资源前,执行如下步骤驱动模块在使用嵌入式设备的资源前,调用互斥锁管理类函数获得互斥锁对要使用的临界资源加锁;在这一过程中,如果驱动模块要使用的资源已经加锁,则等待该资源被释放后才能获得互斥锁;在驱动模块使用完嵌入式设备的资源后,调用互斥锁管理类函数释放互斥锁。当应用程序进行多次与嵌入式设备的控制信息和/或数据交互时,每次都应当对可能发生并行访问冲突的资源加锁,并在使用完毕后解锁。实模式下驱动模块对嵌入式设备的缓存、寄存器的读写操作,可以调用通过现有技术中已有通用于不同操作系统的标准库函数实现。对实模式操作系统,采用本发明所述的驱动方法后,实模式操作系统的嵌入式设备驱动结构如图5所示,驱动模块工作在操作系统抽象层与应用程序之间,与VxWorks、OSE操作系统通过统一的操作系统抽象接口函数进行交互,与应用程序之间通过驱动抽象接口函数进行交互。这样,驱动模块和应用程序不经改动即可适用于多个实模式操作系统。在保护模式操作系统中,与嵌入式设备的直接交互必须在内核态进行。而不同的操作系统的内核态差异非常大,实现内核态操作系统接口的封装不具备可行性,也就是说,工作在内核态的模块很难实现可移植性。因此,本发明中,将驱动模块在操作系统抽象层上实现,同时,建立操作系统内核态内存空间与用户态内存空间的映射关系,将嵌入式设备的控制寄存器、状态寄存器、缓存等都映射到驱动模块可访问的用户态内存空间,使得驱动模块可以通过对上述用户态内存空间的读写完成与嵌入式设备的控制信息和/或数据交互。对于需要进行中断处理的嵌入式设备,还需要解决内核态的中断信息如何传送到用户态驱动模块的问题。本发明采用异步通知函数来实现,当嵌入式设备产生中断后,工作在内核态的异步通知函数清空中断,生成实时信号传递到用户态的驱动模块。除了涉及内存映射和实时信号的部分以外,本发明所述方法在实模式操作系统中与在保护模式操作系统中基本上相同。图6所示为在保护模式操作系统中,本发明所述嵌入式设备驱动方法的流程。在步骤S210,将不同操作系统的API封装为统一的操作系统抽象接口函数。即提取出不同操作系统的API所具有的共性,并根据其共性制定出操作系统统一的封装接口操作系统抽象接口函数。同样,这些操作系统抽象接口函数是前述操作系统抽象层的组成部分。驱动模块使用的这些操作系统抽象接口函数包括任务管理类函数用来创建、删除从嵌入式设备接收实时信号的任务;内存管理类函数用来创建、删除内存池,从内存池中分配内存,将内存归还给内存池。具体而言,驱动模块使用该类函数与嵌入式设备进行数据交互的缓存,实现静态内存动态使用的目的;实时信号管理类函数用来创建、删除、等待和释放实时信号。具体而言,当嵌入式设备产生中断后,使用该类接口以实时信号的形式通知用户态的驱动模块该嵌入式设备产生了中断。驱动模块将进行中断处理,例如如果是接收中断,则通知应用程序接收数据;如果是告警中断,则通知应用程序设备故障;消息管理类函数用来创建、删除消息队列,将消息发送到消息队列,从消息队列中接收消息。具体而言,驱动模块获知嵌入式设备产生中断,需要通知应用程序,则使用该类函数以消息的形式通知应用程序,同时还可以使用该类函数将嵌入式设备的数据传送至应用程序。;互斥锁管理类函数用来创建、删除、锁定和打开互斥锁。具体而言,驱动模块使用该类函数实现对嵌入式设备的临界资源(如缓存)的互斥操作;上述操作系统抽象接口的各类函数中,只有实时信号管理类函数与实模式操作系统中不同,并且其用户只有驱动模块,应用程序不使用该类接口。在步骤S220,令驱动模块为应用程序提供统一的驱动抽象接口函数。一般会包括下述函数打开设备函数用来启动对嵌入式设备的访问;关闭设备函数用来结束对嵌入式设备的访问;复位设备函数用来重新启动对嵌入式设备的访问;发送数据函数用来向嵌入式设备发送数据;接收数据函数用来从嵌入式设备接收数据;输入输出控制函数用来进行与嵌入式设备的控制信息的交互。与实模式操作系统中相同,驱动抽象接口函数可以根据具体的嵌入式设备的使用方法来确定,例如,以嵌入式ATM(AsynchronousTransferMode,异步传输模式)设备为例,驱动模块向应用程序提供如下驱动抽象接口函数链路创建函数(即打开设备函数)s32open(u32u32ModuleId,conststruOpen*pStruOpen,u32*pu32ConnId),其中第一个参数为驱动模块在操作系统中的ID(代号),第二个参数为物理链路创建使用的数据结构指针,第三个参数为驱动返回的链路编号;链路关闭函数(即关闭设备函数)s32close(u32u32ModuleId,u32u32ConnId),其中第一个参数为驱动的模块ID,第二个参数为链路编号;链路复位函数(即复位设备函数)s32reset(u32u32ModuleId,u32u32ConnId),其中第一个参数为驱动的模块ID,第二个参数为链路编号;发送数据函数s32write(u32u32ModuleId,u32u32ConnId,u16u16Len,constu32*pu32Buf),其中第一个参数为驱动的模块ID,第二个参数为链路编号,第三个参数为数据长度,第四个参数为指向发送数据的指针;接收数据函数s32read(u32u32ModuleId,u32u32ConnId,u16u16Len,u32*pu32Buf),其中第一个参数为驱动的模块ID,第二个参数为链路编号,第三个参数为数据长度,第四个参数为指向接收数据的指针;输入输出控制函数s32ioctl(u32u32ModuleId,u32Cmd,u32Arg),其中第一个参数为驱动的模块ID,第二个参数为I/O指令,第三个参数为I/O参数。输入输出函数提供了一种执行嵌入式设备的命令的方法,有人把它戏称为“垃圾桶”函数,即除了链路创建、链路关闭、链路复位、数据发送、数据接收外的其它功能都可归为输入输出操作。其第三个参数u32Arg可以是一个变量,也可以是一个数据结构的地址,可以根据需要进行设计,如查询数据发送统计信息、查询数据接收统计信息、查询芯片相关配置信息、安装告警回调函数、安装接收回调函数等等操作,都可以通过输入输出函数实现。在步骤S230,将嵌入式设备登记为操作系统支持的虚拟设备,建立虚拟设备的内核态内存空间与驱动模块的用户态内存空间之间的映射。每个嵌入式设备的控制寄存器、状态寄存器、缓存所占的地址空间均属于内核态地址空间的一部分,如前所述,在建立了内核态与用户态之间的内存映射后,工作在用户态的驱动模块即可通过此内存映射对嵌入式设备进行操作。建立内存映射关系通过调用在内核态操作系统中登记的内存映射函数实现。在操作系统启动时,需要进行对嵌入式设备的初始化工作,如设备检测、向操作系统申请嵌入式设备占用的资源等;嵌入式设备可能占用的资源包括中断、内存等;对需要进行资源同步的嵌入式设备,例如具有接收数据功能的通信类设备,在满足设定的条件时嵌入式设备会产生接收中断,因此驱动模块要为该嵌入式设备登记中断号和中断服务程序入口,这些均与现有技术相同,此处不再赘述。本步骤可以在操作系统启动时执行,也可以在操作系统启动后第一次使用嵌入式设备前执行。在步骤S240,对需要进行中断处理的嵌入式设备,在操作系统为虚拟设备登记异步通知函数,用来在嵌入式设备产生中断时以实时信号的形式通知用户态的驱动模块该嵌入式设备产生了中断及该中断的类型。嵌入式设备产生中断后,操作系统根据该嵌入式设备登记的中断服务程序入口启动中断服务程序的执行,在中断服务程序中调用异步通知函数。在步骤S250,应用程序调用打开设备函数通知驱动模块对嵌入式设备进行访问,并向驱动模块传递嵌入式设备的工作参数。在步骤S260,驱动模块启动嵌入式设备。驱动模块调用任务管理类函数创建从嵌入式设备接收实时信号的任务,同时,驱动模块根据应用程序指定嵌入式设备的工作参数,通过内存映射方式对嵌入式设备进行相应的配置。为对嵌入式设备的临界资源进行保护,避免多任务环境下的并行访问冲突,还需要调用互斥锁管理类函数创建互斥锁。在步骤S270,应用程序调用操作系统抽象层提供的操作系统抽象接口函数和驱动抽象接口函数,通过内存映射与嵌入式设备进行控制信息和/或数据的交互。本步骤实际上是应用程序使用嵌入式设备的具体过程,在这一过程中应用程序可以进行发送数据、接收数据、发送控制信息、读取控制信息、复位嵌入式设备等中的一项或数项工作,以下分别介绍每项工作的具体执行步骤。应用程序向嵌入式设备发送数据的过程为应用程序调用操作系统抽象层提供的内存管理类函数从其占用的内存池中分配发送缓冲区;应用程序将数据拷贝到发送缓冲区;应用程序调用发送数据函数将发送缓冲区的指针传递给驱动模块;驱动模块将发送缓冲区中的数据拷贝到嵌入式设备的缓存中,由嵌入式设备根据应用程序的控制信息对数据进行处理;待数据拷贝完毕后,驱动模块调用内存管理类函数将发送缓冲区归还到应用程序的内存池中。需要说明的是,虽然驱动模块对嵌入式设备的发送缓存进行写操作是在用户空间进行的,但由于嵌入式设备初始化时已进行过内存映射,所以,该嵌入式设备映射后在用户空间的缓存地址,就相当于映射前在内核空间的缓存地址。因此要发送的数据实际上拷贝到了该嵌入式设备在内核空间的缓存中。应用程序从嵌入式设备读取数据的过程为驱动模块调用实时信号管理类函数创建并等待实时信号;嵌入式设备产生中断,内核态操作系统调用登记的异步通知函数,清空中断,产生实时信号发送至用户态的驱动模块,实时信号中包括该实时信号的标识信息(ID),用来表示产生中断的嵌入式设备和中断类型;驱动模块收到实时信号后,将嵌入式设备中的数据传送至应用程序。驱动模块有两种方式实现这一过程第一种是以消息的形式通知应用程序取走数据;第二种是直接将从嵌入式设备接收的数据作为消息的净荷送往应用程序的消息队列。采用上述第一种方式的具体流程如下驱动模块调用消息管理类函数发送消息通知应用程序接收数据;应用程序收到通知消息后,先调用内存管理类函数从所占内存池中分配接收缓冲区,再调用接收数据函数将接收缓冲区的指针传递给驱动模块;驱动模块从嵌入式设备的缓存中将数据拷贝到应用程序指定的接收缓冲区中;应用程序对接收数据处理完毕后调用内存管理类函数将接收缓冲区归还到其内存池中。采用上述第二种方式的具体流程如下驱动模块调用内存管理类函数从所占内存池中分配接收缓冲区;驱动模块从嵌入式设备的缓存中将数据拷贝到接收缓冲区中;驱动模块调用消息管理类函数将接收缓冲区中的数据作为消息的净荷送往应用程序的消息队列;应用程序对接收数据处理完毕后调用内存管理类函数将接收缓冲区归还到驱动模块的内存池中。需要说明的是,在上述两种方式中,虽然驱动模块对嵌入式设备的缓存进行读操作是在用户空间进行的,但由于嵌入式设备初始化时已进行过内存映射,所以,该嵌入式设备映射后在用户空间的缓存地址,就相当于映射前在内核空间的缓存地址。因此驱动模块拷贝的数据实际上来源于该嵌入式设备在内核空间的缓存。是采用第一种方式,还是第二种方式取决于应用需求。两者的区别是采用第一种方式,应用程序分配接收缓冲区,驱动模块提供数据接收函数;采用第二种方式,驱动模块分配接收缓冲区,并且不需要提供数据接收函数。应用程序向嵌入式设备发送控制信息的过程为应用程序调用输入输出控制函数将控制信息发送至驱动模块;驱动模块通过内存映射将控制信息写入嵌入式设备的控制寄存器。应用程序从嵌入式设备读取控制信息的过程为应用程序调用输入输出控制函数通知驱动模块读取嵌入式设备的控制信息;驱动模块通过内存映射读入嵌入式设备寄存器中的控制信息,并向应用程序返回该控制信息。在应用程序对嵌入式设备的使用过程中,如果嵌入式设备发生异常,或者应用程序需要打断嵌入式设备正在进行的工作时,则需要复位嵌入式设备。具体过程为应用程序调用复位设备函数通知驱动模块复位对嵌入式设备的访问;驱动模块清空嵌入式设备的缓存和已接收但未处理的实时信号。与实模式操作系统中相同,应用程序可以根据实际需要,交叉重复地多次进行上述各个过程。在步骤S280,当应用程序不再使用嵌入式设备时,调用关闭设备函数通知驱动模块结束对嵌入式设备的访问。在步骤S290,驱动模块停止嵌入式设备。驱动模块调用任务管理类函数删除从嵌入式设备接收实时信号的任务,同时,解除内存映射关系,还需要调用互斥锁管理类函数删除互斥锁,解除对嵌入式设备临界资源的保护。对于支持并行多任务的操作系统,在驱动模块使用可能与其他任务发生并行访问冲突的资源前,执行如下步骤驱动模块在使用嵌入式设备的资源前,调用互斥锁管理类函数获得互斥锁对要使用的临界资源加锁;在这一过程中,如果驱动模块要使用的资源已经加锁,则等待该资源被释放后才能获得互斥锁;在驱动模块使用完嵌入式设备的资源后,调用互斥锁管理类函数释放互斥锁。当应用程序进行多次与嵌入式设备的控制信息和/或数据交互时,每次都应当对可能发生并行访问冲突的资源加锁,并在使用完毕后解锁。保护模式下驱动模块对用户态内存的读写操作,可以通过调用现有技术中已有通用于不同操作系统的标准库函数实现,因而本文中对这一过程不再赘述。在内核态操作系统中登记的内存映射函数和异步通知函数可以为超过一个工作在用户态的驱动模块服务。进行内存映射时,映射足够的内存空间,使得超过一个用户态下的驱动模块能够对各自的嵌入式设备进行控制信息和/或数据的交互。这些嵌入式设备发生中断后,均调用同一个异步通知函数,清空中断,产生对应于发生中断的嵌入式设备的实时信号,并发送此实时信号通知对应的驱动模块。换言之,操作系统为每个嵌入式设备产生的实时信号不同于其他嵌入式设备。这样,多个嵌入式设备在内核态中只产生非常小的开销。应用本发明所述的驱动方法后,保护模式操作系统的嵌入式设备驱动结构如图7所示,驱动模块工作在操作系统抽象层与应用程序之间,运行在操作系统的用户态,与Windows、Linux操作系统通过统一的操作系统抽象接口函数进行交互,与应用程序之间通过驱动抽象接口函数进行交互。而在操作系统的内核态,将嵌入式设备虚拟成操作系统可以识别的字符设备、块设备或是网络设备后,只需要向操作系统登记异步通知函数和内存映射函数,即可实现对嵌入式设备的驱动。可见,在保护模式操作系统中,工作在用户态的驱动模块和应用程序能够不经改动在不同的操作系统上移植,而内核态的异步通知函数和内存映射函数则随操作系统的不同而需要修改。由于这两个函数的功能非常简单,对其进行的修改只需花费很少的时间和精力。仍以嵌入式ATM设备为例,在现有技术中ATM设备的驱动模块代码通常都超过8000行,功能复杂的驱动模块可以达到将近20000行,这些代码在更换操作系统时都需要进行修改。采用本发明后,更换操作系统时只需修改异步通知函数和内存映射函数的代码,而这两个函数的代码加起来不超过50行。在本发明中,在实模式操作系统中和保护模式操作系统中的操作系统抽象接口函数只有对实时信号的处理不同,因此,在实模式操作系统和保护模式操作系统之间,驱动模块的移植也只需进行少量的修改工作。本发明中操作系统抽象接口函数与驱动抽象接口函数在实模式操作系统和保护模式操作系统中则完全相同,因而应用程序不需修改即可通用与各种操作系统上,不论是实模式操作系统还是保护模式操作系统。更为重要的是,采用本发明能有效减少保护模式操作系统中驱动嵌入式设备在用户态和内核态的切换次数,在MontavistaLinux下的实验证明,整个系统的运行效率至少提高一倍,能满足更高的实时性要求。随着某些保护模式操作系统,经过对内核调度方式的改进,成为实模式操作系统后,操作系统抽象层的设计方案就面临着进退两难的困境。如果仅仅封装用户态的API函数,将无法解决驱动模块的移植性问题。如果为驱动模块单独封装内核态的API函数,又无法解决与其他操作系统兼容的问题。而应用本发明后,不影响原有操作系统抽象层的设计思想,无论操作系统是否区分用户态和内核态,均能兼容,并且操作系统抽象层的修改量较小。同时,应用本发明后,驱动开发人员和应用软件开发人员可以使用统一的调试工具,节约培训、购买开发工具等成本。以上所述的本发明实施方式,并不构成对本发明保护范围的限定。任何在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的权利要求保护范围之内。权利要求1.一种保护模式操作系统中嵌入式设备的驱动方法,其特征在于,包括以下步骤A)将不同操作系统的应用程序接口API封装为统一的操作系统抽象接口函数;B)将嵌入式设备登记为操作系统支持的虚拟设备,建立所述虚拟设备的内核态内存空间与驱动模块的用户态内存空间之间的映射;C)所述驱动模块调用所述操作系统抽象接口函数,通过内存映射启动所述嵌入式设备;D)应用程序调用驱动模块和操作系统的接口函数,通过内存映射与嵌入式设备进行控制信息和/或数据的交互;E)所述驱动模块调用所述操作系统抽象接口函数,通过内存映射关闭所述嵌入式设备。2.按照权利要求1所述保护模式操作系统中嵌入式设备的驱动方法,其特征在于所述步骤B)与步骤C)之间包括BC)向操作系统登记所述虚拟设备的异步通知函数,用来在嵌入式设备产生中断时向所述驱动模块发送所述中断的实时信号。3.按照权利要求2所述保护模式操作系统中嵌入式设备的驱动方法,其特征在于,所述步骤A)与步骤B)之间包括AB)所述驱动模块为应用程序提供统一的驱动抽象接口函数;步骤D)所述驱动模块的接口函数为所述驱动抽象接口函数;所述操作系统的接口函数为所述操作系统抽象接口函数。4.按照权利要求3所述保护模式操作系统中嵌入式设备的驱动方法,其特征在于所述驱动抽象接口函数包括打开设备函数和关闭设备函数,其中打开设备函数用来启动对嵌入式设备的访问;关闭设备函数用来结束对嵌入式设备的访问;所述步骤BC)与步骤C)之间包括应用程序调用打开设备函数通知驱动模块对嵌入式设备进行访问,并向驱动模块指定嵌入式设备的工作状态;所述步骤D)与步骤E)之间包括应用程序调用所述关闭设备函数通知所述驱动模块结束对所述嵌入式设备的访问。5.按照权利要求4所述保护模式操作系统中嵌入式设备的驱动方法,其特征在于所述驱动抽象接口函数还包括输入输出控制函数,用来进行与嵌入式设备的控制信息的交互;所述步骤D)包括应用程序向嵌入式设备发送控制信息的过程,具体为应用程序调用所述输入输出控制函数将控制信息发送至驱动模块;驱动模块通过内存映射将控制信息写入嵌入式设备的寄存器。所述步骤D)包括应用程序从嵌入式设备读取控制信息的过程,具体为应用程序调用所述输入输出控制函数通知驱动模块读取嵌入式设备的控制信息;驱动模块通过内存映射读入嵌入式设备寄存器中的控制信息,并向应用程序返回该控制信息。6.按照权利要求5所述保护模式操作系统中嵌入式设备的驱动方法,其特征在于所述操作系统抽象接口函数包括任务管理类函数,用来创建、删除从嵌入式设备接收实时信号的任务;步骤C)具体为驱动模块调用所述任务管理类函数创建从嵌入式设备接收实时信号的任务,并根据应用程序的指定通过内存映射设置嵌入式设备的工作状态;步骤E)具体为驱动模块调用所述任务管理类函数删除从嵌入式设备接收实时信号的任务,停止嵌入式设备,并解除所述内存映射。7.按照权利要求6所述保护模式操作系统中嵌入式设备的驱动方法,其特征在于所述操作系统抽象接口函数还包括内存管理类函数,用来创建、删除内存池,从内存池中分配内存,将内存归还给内存池;所述驱动抽象接口函数还包括发送数据函数,用来向嵌入式设备发送数据;所述步骤D)包括应用程序向嵌入式设备发送数据的过程,具体为应用程序将数据拷贝到调用所述内存管理类函数分配的发送缓冲区中;应用程序调用所述发送数据函数将所述发送缓冲区的指针传递给驱动模块;驱动模块将发送缓冲区中的数据通过内存映射拷贝到嵌入式设备的缓存中。8.按照权利要求7所述保护模式操作系统中嵌入式设备的驱动方法,其特征在于所述操作系统抽象接口函数还包括实时信号管理类函数和消息管理类函数,其中实时信号管理类函数用来创建、删除、等待和释放实时信号;消息管理类函数用来创建、删除消息队列,将消息发送到消息队列,从消息队列中接收消息;所述驱动抽象接口函数还包括接收数据函数,用来从嵌入式设备接收数据;所述步骤D)包括应用程序从所述嵌入式设备接收数据的过程,具体为D1)驱动模块调用实时信号管理类函数创建并等待实时信号;D2)操作系统根据嵌入式设备的中断调用所述异步通知函数产生实时信号发送至驱动模块;D3)驱动模块通过调用所述消息管理类函数通过内存映射将嵌入式设备中的数据传送至应用程序。9.按照权利要求8所述保护模式操作系统中嵌入式设备的驱动方法,其特征在于,步骤D2)具体为操作系统根据产生中断的嵌入式设备调用异步通知函数产生对应于所述嵌入式设备的实时信号,并将所述实时信号发送至所述嵌入式设备的驱动模块。10.按照权利要求9所述保护模式操作系统中嵌入式设备的驱动方法,其特征在于,所述步骤D3)具体为驱动模块调用所述消息管理类函数发送消息通知应用程序接收数据;应用程序调用所述内存管理类函数分配接收缓冲区,调用所述接收数据函数将接收缓冲区的指针传递给驱动模块;驱动模块通过内存映射将嵌入式设备缓存中的数据拷贝到应用程序指定的接收缓冲区。11.按照权利要求10所述保护模式操作系统中嵌入式设备的驱动方法,其特征在于,所述步骤D3)具体为驱动模块调用内存管理类函数分配接收缓冲区,并通过内存映射从嵌入式设备的缓存中将数据拷贝到接收缓冲区中;驱动模块调用消息管理类函数将接收缓冲区中的数据作为消息的净荷送往应用程序的消息队列。12.按照权利要求9至11任意一项所述保护模式操作系统中嵌入式设备的驱动方法,其特征在于所述驱动抽象接口函数还包括复位设备函数,用来重新启动对嵌入式设备的访问;所述步骤D)包括应用程序复位嵌入式设备的过程,具体为应用程序调用所述复位设备函数通知驱动模块复位对嵌入式设备的访问;驱动模块清空嵌入式设备的缓存和未处理的实时信号。13.按照权利要求12所述保护模式操作系统中嵌入式设备的驱动方法,其特征在于所述操作系统抽象接口函数还包括互斥锁管理类函数,用来创建、删除、等待和释放互斥锁;所述驱动方法还包括驱动模块在使用嵌入式设备的资源前,调用所述互斥锁管理类函数获得互斥锁对要使用的临界资源加锁;驱动模块使用完嵌入式设备的资源后,调用所述互斥锁管理类函数释放互斥锁。14.一种实模式操作系统中嵌入式设备的驱动方法,其特征在于,包括以下步骤a)将不同操作系统的应用程序接口API封装为统一的操作系统抽象接口函数;b)驱动模块调用所述操作系统抽象接口函数启动嵌入式设备;c)应用程序通过调用驱动模块和操作系统的接口,与嵌入式设备进行控制信息和/或数据的交互;d)驱动模块调用所述操作系统抽象接口函数停止嵌入式设备。15.按照权利要求14所述实模式操作系统中嵌入式设备的驱动方法,其特征在于,所述步骤a)与步骤b)之间包括ab)所述驱动模块为应用程序提供统一的驱动抽象接口函数;步骤c)所述驱动模块的接口函数为所述驱动抽象接口函数;所述操作系统的接口函数为所述操作系统抽象接口函数。全文摘要本发明公开了一种保护模式操作系统中嵌入式设备的驱动方法,包括将不同操作系统的应用程序接口API封装为统一的操作系统抽象接口函数;将嵌入式设备登记为操作系统支持的虚拟设备,建立所述虚拟设备的内核态内存空间与驱动模块的用户态内存空间之间的映射;应用程序调用驱动模块和操作系统的接口函数,通过内存映射与嵌入式设备进行控制信息和/或数据的交互。本发明还公开了一种实模式操作系统中嵌入式设备的驱动方法。应用本发明后,驱动模块能够不经改动在不同的实模式操作系统上移植,而只需对在内核态函数进行少量改动即可在保护模式操作系统上移植,并提高系统的运行效率;应用程序不经改动即可在各种操作系统上移植。文档编号G06F9/44GK1866202SQ200510070699公开日2006年11月22日申请日期2005年5月18日优先权日2005年5月18日发明者陈剑申请人:大唐移动通信设备有限公司
再多了解一些
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1