|
在某些特定的工业应用领域,普通的操作系统并不适用,需要采用实时操作系统。
目前,已有许多实时操作系统如:vxworks、psos、qnx、hard-linux、wince等等,其中美国wind river system 公司的vxworks是公认的性能最出色的一种实时操作系统。这是一个运行在目标机上的高性能、可裁减的嵌入式实时操作系统。它的软件开发平台是tornado。
本文以vxworks操作系统为平台,以m-system公司的doc2000(144m)为例,说明在vxworks下如何驱动并使用电子盘设备。
1 系统结构
doc 系列的电子盘采用的都是trueffs(true flash file system)。trueffs for tornado ii是tornado ii开发环境中的一个集成的快速闪存文件系统,它是使用一系列的嵌入式闪存设备来实现快速可靠的物理存储的。通过vxworks的trueffs仿真dos文件系统下的硬盘驱动器,开发者可以使用标准的文件系统接口来产生和操作一个文件系统。这样,在闪存设备上进行读写操作就与在dos文件系统设备上是一样的了。因此,对于电子盘驱动的介绍就需要分为上层操作系统的文件系统和底层的驱动器物理结构实现两部分。
1.1 vxworks中的文件系统
vxworks是一种功能强大而且比较复杂的嵌入式操作系统,包括了进程管理、存储管理、设备管理、文件系统管理、网络协议及系统应用等几个部分。vxworks只占用了很小的存储空间,并可高度裁减,保证了系统能以较高的效率运行。
vxworks提供的快速文件系统适合于实时系统应用。它包括几种支持使用块设备(如磁盘)的本地文件系统。这些设备都使用一个标准的接口从而使得文件系统能够被灵活地在设备驱动程序上移植。vxworks也支持scsi磁带设备的本地文件系统。vxworks支持四种文件系统:dosfs、rt11fs、rawfs、tapefs。
vxworks的i/o系统将普通数据文件、外部设备都统一作为文件处理。它们在用户面前有相同的语法定义,使用相同的保护机制。这样既简化了系统设计又便于用户使用。vxworks i/o 体系结构甚至还支持在一个单独的vxworks系统上同时并存几个不同的文件系统。vxworks提供了一个快速灵活的与ansi c 兼容的i/o 系统,包括:unix 标准的缓冲i/o、posix 标准的异步i/o。vxworks包括以下驱动程序:网络驱动、管道驱动、ram 盘驱动、scsi驱动、键盘驱动、显示驱动、磁盘驱动、并口驱动。
vxworks的所有机制和功能都是基于“c子程序”这种简单结构的,即:vxworks的所有功能都是由c程序库提供的。任何c程序都能够从tornado的命令和调试环境中交互式地调用;任何c程序都能够作为vxworks的一个任务从tornado主机工具或者应用程序中产生,而且c程序能够与中断、看门狗定时器或辅助定时器相连。vxworks的这种统一性使tornado成为一种有效的开发系统。因为用户不必再编写特殊的代码来与系统陷阱接口,也不需要进行特殊的处理来建立一个任务,更不需要编写特殊的用户接口程序或交互式的测试程序来测试新代码,用户只要编写子程序就能够完成所有这些工作。
vxworks的特性为编写应用程序和设备驱动程序提供了极大的便利。在vxworks下,设备驱动程序既可以嵌入内核随系统一起启动,也可以作为可加载模块在系统启动之后运行,无论采用哪一种方式编写驱动程序,需要注意的一点就是:其使用不能依赖于还没有启动的功能模块(例如c库函数)或者未激活的设备。
1.2 电子盘
电子盘的内部存储介质flash是近年来发展最快的一种存储芯片,它具有eeprom可擦写的特点,又同时具有eprom 廉价的特点,它是一种高性能、低功耗、电可擦除的存储器件。电子盘由于上述特点,现已经广泛应用于信息存储、机顶盒、瘦客户机、瘦主机、网络计算机、以及嵌入式计算机等很多系统。
trueffs是m-system 公司开发出来的可用于电子盘设备的专利技术。trueffs的基本功能就是磁盘仿真。它提供像doc一样的块设备的接口,从而方便了操作系统对电子盘设备的逻辑区的读写。通过trueffs可以对电子盘进行读写、分区、格式化等一系列操作。通过对操作系统的l/o控制的调用,就可以访问trueffs的外部接口。电子盘设备的i/o控制并不局限于某一特定操作系统,所以可以兼容多种操作系统。通常,在操作系统下驱动电子盘有以下两步:
①调用操作系统的getdriverhandle()函数得到驱动器的句柄。它的返回值是一个能够供i/o控制函数调用的trueffs驱动的描述符。这一步依赖于操作系统的文件系统。
②调用操作系统中文件系统的iocontrol()函数。它将使trueffs具有其它文件系统的特性:
1)文件系统状态。它的值可以指示操作指令是否成功的传递给了驱动器或者驱动器对于操作指令有无响应,但它并不能确认操作的结果或状态。一个操作的结果或状态是由输入输出控制包(io package)来传递的。它们使用的是trueffs的标准状态码,这些状态码可以在io控制的头文件以及一些驱动包文件中查到。
2)文件系统io控制。它可以调用文件系统的扩展功能。
3)输入输出请求包。所有的trueffs扩展功能都使用下列输入输出请求包,它的定义格式如下:
typedef struct
{
flhandle irhandle;
unsigned irflages;
flsimplepath far1 *irpath;
void far1 *irdata;
long irlength;
long ircount;
}
irhandle(句柄)主要用于确认一个操作究竟应该作用于哪一个分区。如果只有一个驱动器,那么就不会出现冲突,则句柄的值可以设置为0。驱动器的句柄包含了物理驱动数(lsb 0-3)和分区数(lbb 4-7)。由于binary partition和disk partition的句柄都可以从0开始。所以,binary partition和disk partition总是通过不同的句柄来访问,以免产生冲突。
irflags这个变量用来标识扩展功能的类型。每一个扩展功能都有一个枚举类型的代码标识。
irdata包含了一个指向flloctlrecond记录的指针。flloctlrecond记录包含了一些扩展功能的输入输出记录的指针。
doc2000为m-system 公司doc系列的第二代产品,它为32脚dip封装,具有体积小,封装简单的特点,通过将doc2000插入doc2000插槽,可以大量减少占用的物理空间。

如图所示,doc2000由系统接口单元(system interface)、系统引导模块(boot block)、错误检测与更正单元(edc/ecc),闪存控制单元(flash control)以及flash存储介质组成。其中系统接口单元为doc2000提供一个类sram 接口,使之能通过cpu的本地总线、isa总线、sram 总线、eeprom 接口建立与操作系统的连接。doc提供片选信号(ce#)、读写信号(we#)、使能信号(oe#)以及13位宽的地址线(a[0:12])和8位宽的数据总线(d[0:7])。每个doc占用系统8k的地址空间,通过地址窗的滑动来访问整个doc空间。系统引导模块用来响应pc机结构中bios扩展设备的搜索。当bios检测到doc2000为扩展设备时,它可以执行保存在系统引导模块中的trueffs的驱动程序,通过系统调用trueffs格式转换软件,系统可以把doc2000映射为普通的硬盘从而方便地进行读写。doc2000的错误检测和更正模块用来提供数据错误的检测、更正以及数据保护。flash控制模块主要用来完成trueffs地址与flash介质地址之间的转换、数据传输控制等功能。
2 电子盘设备驱动程序的基本结构流程
在vxworks下,设备驱动程序既可以嵌入内核随系统一起启动,也可以作为可加载模块在系统启动之后运行。
2.1可选加载方式
可选加载方式驱动电子盘是一种比较常用的方式。它是把驱动程序制作成一个可独立运行的应用程序,当需要的时候可以选择加载到用户程序集中。利用可选加载方式驱动电子盘的第一步是要确定电子盘所占用的系统地址窗的范围。一般主机板都给出了几个可以选择的范围,通过跳线可以设置电子盘的地址窗的起始、结束地址。启动vxworks下trueffs驱动程序,根据实际的地址将地址窗参数配置好。第二步将trueffs映射成dos文件系统。调用tffsmakehandle()函数得到驱动器的描述符。将此描述符传递给驱动器句柄。然后定义一个块设备的指针用于保存一个虚拟dos文件系统分区的信息。调用tffsdevcreate()函数将刚才检测到句柄的trueffs驱动器映射成dos文件系统分区,并将该函数的返回值传递给定义好的块设备指针。至此,就完成了trueffs到dosfs的映射过程。完成dosfs设备初始化后,在tornado的shell环境下运行devs命令就可以看到tffs设备已经在系统设备列表中了。第三步,读写电子盘上的文件。设置好要读写的文件的文件名、路径。利用标准c++的文件系统函数就可以方便的读写文件了。
2.2嵌入系统方式
嵌入系统方式比可选加载方式要复杂。它将驱动程序嵌入系统内核中,这样电子盘可以在系统启动的时候被驱动。这种方式主要应用于系统引导文件放在电子盘上的情况。嵌入系统方式又分为x86机的嵌入方式和其它(如powerpc,mips等)嵌入方式。这里以x86方式为例。
第一步修改目标bsp目录下的config.h文件,增加电子盘设备的定义,修改引导设备。第二步修改系统bsp目录下的bootconfig.c文件,将电子盘的驱动程序加入。第三步修改系统bsp目录下的usrconfig.h文件,调用电子盘的驱动程序。
3 设备驱动程序示例
下面给出doc2000的可选加载方式的驱动程序的框架代码,嵌入系统方式下的doc2000的驱动程序涉及vxworks系统内核,这里不作详细叙述。
3.1定义头文件、常量、全局变量
#include "fldrvvxw.h"
#include "dosfslib.h"
long tfsaddresses[2]={0xd8000,0xdfff};
/*定义电子盘的地址窗范围*/
int isocket=0;
/*trueffs内部变量*/
int idisk=0; /*电子盘数量(1个)*/
nt handle; /*驱动器句柄*/
nt flags=0;
/*将trueffs仿真成dos fat16的格式*/
blk_dev * tffs_blk_dev; /*块设备指针*/
char filepath[50]="/tffs0/test.txt"; /*文件路径*/
file fp; /*文件指针*/
3.2 驱动电子盘并将trueffs映射为dosfs
docdriver()
{
tfssetup(1,tfsaddresses); /*trueffs驱动程序*/
handle= tfsmakehandle(isocket,idisk);
/{得到驱动器的句柄{/
tfs_ blk_dev=tfsdevcreate(handle,flags);
/*得到仿真dosfs的块设备信息*/
dosfsinit (20);
/*初始化dosfs的参数*/
dosfsdevinit ("/tfs0/",tffs_blk_dev,null); /*初始化dosfs设备*/
taskdelay(sysclkrateget()/2); /*系统延时*/
}
3.3 电子盘文件的读写
filereadwrite()
{
fp=fopen(filepath,"r+");
…… /*相关文件操作*/
fclose(fp);
维库电子市场网(www.dzsc.com) 浏览更多信息
|