马 昕 ,张士洋
(1.中国海洋大学物理海洋教育部重点实验室,山东 青岛266003;2.中国海洋大学海洋发展研究院,山东 青岛266003)
一种实现海洋监测仪器大容量信息存储的方法
马 昕1,张士洋2
(1.中国海洋大学物理海洋教育部重点实验室,山东 青岛266003;2.中国海洋大学海洋发展研究院,山东 青岛266003)
现代化建设对海洋监测仪器信息存储提出了更高的要求,尤其是要客观真实地反映实验现象,需要的测试点增多、记录数据量加大,使得许多小存储量海洋监测仪器不能满足当前实验的要求。通过采用嵌入式实时操作系统VxWorks,在扩充的海量flash上运行文件系统来管理数据和代码,为了更有效地管理大容量的nandflash存储芯片上的数据文件,在VxWorks系统上设计了文件系统,实现了TureFFS块设备驱动,与本机dosFs文件系统挂接在海洋监测仪器内测记录节点,从而解决了系统信息的大容量存储。最后通过利用该方法设计的钽丝测波仪进行实验,实验结果较好地还原了波浪的真实图像。研究的方法具有广泛的适用性,在其他海洋测试系统中也有广泛的应用前景。
NAND Flash;VxWorks;板级支持包 BSP;TureFFS
自容式海洋监测仪器的发展,要求将系统测量的数据采样并传送给内测记录节点,该节点用来记录并保存数据,回收后将数据导出,用于数据分析。目前使用的一些自容式海洋监测仪器系统中使用的内测记录节点,由于受到自身存储容量的限制,一般需要每隔一定时间周期采样一次数据并存储。但是随着任务的多样化、测量数据的复杂性,信息数据源增多,对数据采集的密度和存储系统的容量也不能满足要求,导致实验情况不能得到全面的反应。比如现在使用的某型波浪测量仪,由于存储容量的限制,一般每0.1 s采样一次数据并存储,如果要更加全面地得到实验情况,采样密度至少要增大10倍,则数据总量必然成比例增长,可见此时内测记录节点的存储容量和数据的导出方式已经成为能否客观还原实验状况的基本保证。所以海洋监测仪器的大容量信息存储的实现,可以保证能够更加全面地得到实验数据,更加真实地还原实验状况。
本文提出的一种实现方法,采用嵌入式实时系统Vx-Works作为操作系统,设计和实现了基于VxWorks的文件系统,并通过文件系统来管理大容量数据。硬件方面采用低功耗32位微处理器ARM作为嵌入式系统的控制芯片,来减少海洋监测仪器的功耗和散热量。
内测记录节点大容量存储的实现离不开文件系统对数据文件的管理和调度。PC机使用的文件系统功能强大,但是对于海洋监测仪器这类嵌入式系统来说,文件系统过于复杂;并且DOS操作系统的非实时特性也无法满足监测仪器应用的要求,而嵌入式实时操作系统的引入将很好地解决这一问题。嵌入式操作系统VxWorks以其强实时性、高可靠性、稳定性及体积小等优势在商用和军用领域得到广泛应用[1],用它来代替传统的DOS操作系统管理内测节点的数据文件,使得系统尺寸大大精简,并且使实现多任务的海洋监测成为可能,系统稳定性也得到了保证。
存储芯片方面,存储器NAND Flash因为其具有容量大、体积小等优势,被看作信息存储器扩展的理想选择[2],最新资料显示,其单片的最大存储容量已经可以达到2 G,势必成为海洋监测领域嵌入式数据存储的主流发展方向。本文采用samsung公司的16 MB的NANDFlash芯片K9F2808UOB。
随着文件量的增加,必然引入管理和调度问题,操作系统对文件系统的支持则成为系统扩展大容量存储的前提条件。
VxWorks中,文件系统是块设备和I/O子系统间的接口[3]。文件系统并不与特定类型的块设备或驱动绑定,它和设备驱动间使用标准接口,这样文件系统可以灵活地在设备驱动上移植。VxWorks包括几种支持使用块设备(如RAM,软盘,硬盘,Flash 等)的本地文件系统,如 dosFs、rt11Fs、rawFs、tapeFs、cdRomFs等。其中dosFs提供给用户极大的灵活性以满足块存取设备的实时操作,可以任意创建任意数目文件;使用连续文件模式,提高操作性能;广泛兼容各种可存储和可检索媒体(如flash、软盘和硬盘等);支持FAT12、FAT16和FAT32文件分配表格式;可以从dosFs文件系统中启动VxWorks操作系统等,最后一点尤为重要。
VxWorks的文件系统与底层硬件存储器之间有一层抽象的块设备驱动层。TureFFS是目前常用的在VxWorks上实现文件系统的方法,TureFFS(Ture Flash File System)驱动是M-Systems公司为VxWorks定制的,为各种Flash存储器提供通常的块设备接口。它由Translation layer,MTDs,Socket Layer三部分组成,开发者面向Socket和MTD两层。
实现TureFFS是在操作系统基础上对NAND Flash块设备进行读写或擦除等操作的必要前提。基于VxWorks操作系统的FLASH文件系统TureFFS的实现,使得系统文件的大容量存储和有序管理成为可能,应用在海洋监测仪器内测记录节点的信息存储领域,会使测试数据的导出更加方便快捷[4]。
TureFFS是Tornado开发环境中集成的,相当于硬件块设备的驱动接口,它不是直接与I/O系统接口,而是与I/O系统下的文件系统接口[5]。文件系统实现了大部分的功能,块设备驱动程序只需提供读块、写块、复位设备、执行I/O控制和检查设备状态的例程,方便了使用一系列的嵌入式闪存设备来实现快速可靠的物理存储。为了将Flash抽象为普通的块设备,硬件块设备的驱动接口将Flash映射为一系列连续的虚拟块。
本文使用的块设备是Flash。为了在Flash存储器上使用文件系统,需要添加TFFS驱动,作为文件系统和存储器的中间层。VxWorks为TureFFS提供很完善的支持,TureFFS的MTD已经包括了intel、AMD等厂商的Flash驱动,并可方便地将用户自己的驱动加入进去。上层的dosFs很好地和TureFFS结合,用户可以直接用C语言中常用的文件函数对文件系统操作(文件管理,创建,读,写,存等)。通过仿真Vx-Works dosFs文件系统下的驱动,开发者可以使用标准的文件系统界面来产生和操作一个文件系统,这样,在闪存设备上进行读写操作就与dosFs文件系统设备是一样了。TureFFS允许将Flash芯片或者其一部分作为硬盘一样,通过NFS(网络文件系统)或者dosFs文件系统进行访问。
如前所述,TrueFFS由3层结构实现:翻译层(TL),MTD层和Socket层,如图1所示。
图1 TrueFFS与dosFs
TL层是处理TFFS与dosFs之间的高层接口,为上层软件提供标准块设备接口,主要完成flash到逻辑块的映射、wear-leveling(使flash中的各unit的擦除次数比较平均,从而延长flash使用寿命的一种方法)、废块回收等功能。
MTD层是针对各类不同型号的flash开发的标准内存驱动程序,用于实现Flash存储器相关的操作指令序列。
Socket层是处理TFFS与硬件之间的接口,实现电压控制、基地址设置和写保护控制等。
最上面的Core层不属于TrueFFS,它将其他各层连接起来,将操作传送到其他各层,并处理全局性问题,比如“后台”、垃圾回收、时钟和其他的系统资源。这一层以二进制原码形式提供。
在VxWorks中,TL以库的形式提供,包括TrueFFsDrv、TrueFFsLib以及ftl和fl开头的目标模块;MTD以源代码形式提供,在“ argetsrcdrv ffs”目录下,以Flash芯片型号命名。如果没有特殊芯片的代码,可以参考近似代码,需要改写的地方较多;Socket也以源代码提供,在“targetsrcTrueFFssockets”目录下,按照硬件的具体型号命名,如果找不到对应的代码,同样也需要参考改写一个,改写的部分较少。
由以上分析可知,VxWorks自带的TrueFFS中,已经实现了很多功能。因此需要做的工作主要是:对TL层进行必要的配置,为目标板上的闪存编写MTD层和socket层的驱动程序。在定制TrueFFS时,可以将xxxxmtd.c、tffsConfig.c和sysTffs.c直接添加到自己的BSP目录中,方便代码管理。
本文开发中的采用的是Bootrom加VxWorks的目标机程序映像组织方式,所要达到的设计目标为:
(1)在第一片FLASH中存放Bootrom程序映像,用硬件烧写板加上烧写软件FFT将程序映像写入Flash存储器,在后半部分加载TrueFFS;
(2)在NANDFlash上建立TrueFFS+dosFs文件系统,用于存储程序的映像文件,模块目标文件和配置参数文件等;
(3)通过串口进行调试;
(4)启动FTP服务器,通过它来操作TrueFFS文件系统。
进行BSP的定制时,主要工作是修改与硬件相关的部分,对系统部分不用关心。根据TrueFFS的三层结构分别实现,并完成与系统的挂接。具体实施时,在Socket层,先将“srcdrvTrueFFssockets”目录下的mv177-sysTrueFFs.c复制到BSP目录下,并更名为sysTrueFFs.c,sysTrueffs.c包含了TrueffsConfig.c,还需要复制TrueffsConfig.c到BSP目录。MTD层文件nandMTD.c要自己编写。
(1)在sysTrueFFs.c中修改不多,主要添加自己的MTD宏定义,设置Flash存储器基址和大小,屏蔽无关的写保护操作。主要工作如图2所示。
(2)为了联系socket和MTD层,需要对TrueFFsConfig.c文件进行修改,该文件主要向mtdTable[]表注册自己的MTD:
图2 sysTrueFFs.c的修改
注意还要修改sysTrueFFs.c到当前路径。
(3)nandMTD.c文件可以参考bsp目录下的文件修改,但是因为硬件的特殊性,改动的较多,可以自己编写。这里给出要修改和添加的主要内容:首先是命令、地址和数据的地址定义,每个块上的页数定义为32页,根据K9F2808UOB手册,chip ID为0xec73,在isKnownMedia函数中会引用。然后进行Flash的读写以及擦除的命令、状态和执行等驱动函数的编写。注意,读数据和写数据操作是以页为单位的,而擦除操作是以块为单位的;nandMTDIdentify函数也要根据分支修改。这部分的编码工作量比较大,根据模板的改动很大,基本需要重写,由于篇幅关系不一一列举。
(4)启动时加载TrueFFS文件系统,在bootConfig.c文件的CmdLoop函数开始处添加代码,完成TrueFFS的初始化。初始化时首先调用TrueFFsDrv,如果在config.h中定义INCLUDE_TRUEFFS,则在 usrRoot()中调用 TrueFFsDrv(),这个函数建立TrueFFS管理需要的互斥信号量、全局变量和数据结构,并完成Socket注册和启动Socket查询任务;接着调用TrueFFsDevFormat函数格式化Flash;格式化成功后,便可以加载使用了。调用TrueFFsDevCreate创建块设备;接着调用dosFsInit函数,初始化dos文件系统;最后调用usrTrueFFs-Config函数进行dosFs的安装,这个函数被用来在引导过程中找到并加载VxWorks映像,注意到该函数中没有TrueFFs-Drv调用,所以初始化的一开始,加上了调用TrueFFsDrv的代码。
(5)config.h的配置:其中需配置Bootline;内存地址和大小;Bootrom的大小;包含相关的组件,如INCLUDE_FTP_SERVER,INCLUDE_DOSFS,INCLUDE_TRUEFFS 和自定义的INCLUDE_MTD_NAND宏,用来包含Flash驱动;要确定调试方式为串口WDB_COMM_SERIAL等等。
(6)Makefile文件的修改:加入 MACH_EXTRA=nandMTD.o
添加对nandMTD.c文件的引用,要注意的是sysTrueFFs.c由bootConfig.c包含调用,所以不在Makefile中添加。
(1)Bootrom启动:执行后,ftp server和文件系统已经运行。
(2)加载VxWorks:需要先通过ftp将VxWorks映像传送到TrueFFS文件系统,系统再次启动时会自动从TrueFFS加载VxWorks映像,VxWorks大约852k。建议在调试时用网络加载。
(3)VxWorks启动:Bootrom运行加载 VxWorks后,Vx-Works开始运行,启动了ftp服务器和文件系统,可以在主机上通过ftp客户端连接目标板,更换VxWorks映像,重新启动后,新映像就可以运行了。应用程序映像加载类似。
具体实现时需要注意如下几点:
(1)需要在擦除和写操作中屏蔽中断,因为Flash在擦除、写和读ID状态时,不能正常读取数据。异常入口位于存储器的开始处,异常发生时不能得到正常的入口指令,会导致系统跑飞。
(2)Flash芯片的手册中描述的地址是按字而言,也就是芯片的A0接在CPU的A1上,所以手册给出的指令地址不能直接使用,需要左移一位。
(3)建议在一些函数的入口添加调试信息,打印出入口参数等信息,方便错误定位。
(4)最好在VxWorks中调试TFFS,而不是在bootRom中。
在实际某些应用时,如果对该嵌入式系统上添加实现USB驱动,就可以将节点NANDFlash存储器当做U盘使用,更方便系统测量信息数据与上位机进行交换,系统调试代码的存储及下载也更加方便。
笔者所在物理海洋实验室利用本文的改进方法,将传统的波浪测试仪器——钽丝测波仪进行了内存的扩充。
传统的钽丝测波仪内存只有1 M,最大采样速率只有20 Hz,采集数据的个数也只能达到1 000个左右,利用它测得的波高、周期均不能达到非常准确,在实际物理海洋实验中应用所测量的数据仅能作为参考,对很多物理海洋实验验证方面是不小的缺憾。改进后的钽丝测波仪内存扩充到32 M,最大采样速率可达到50 Hz,采样个数可以达到10 000个左右,完全满足了波浪的测量精度。
为了比较两种测波仪的测量精度,在实验室水槽(如图3)中产生一个波高15 cm、周期12 s的规则正弦波,如图4所示,利用两台仪器测得的平均波高和波形图像来观测测波仪的测量精度。
图3 物理海洋实验室二维造波水槽
为了直观的比较,将两个钽丝测波仪在相同的位置同时进行测量。对改进前的钽丝测波仪采样速率设置为最大20 Hz,采样个数设置为最大的1 000个,其观测的图像如图5所示,测得波形图像是不连续的,并且失真非常严重,利用测得数据进行平均波高的推算,只有12.47 cm左右,与实际设定的15 cm误差大约在2.5 cm左右,远远超出了物理海洋实验要求的0.5 cm的最大误差精度范围。这主要是因为测波仪本身内存容量有限,只能设定比较长的采样间隔周期,中间丢失了很多有用的数据。
图4 二维规则波
图5 改进前钽丝测波仪波形图
利用改进型的钽丝测波仪,设置采样速率为20 Hz,采样个数设置为10 000个,其观测的图像如图6所示,可以明显看出波形图像非常接近连续,几乎没有图像的失真,利用观测数据进行平均波高的推算,测得波高为14.71 cm左右,与实际设定的15 cm误差大约在0.3 cm左右,符合物理海洋实验要求的0.5 cm的最大误差精度范围。
改进后的测波仪由于内存容量的增大,使得测量的时间间隔和测量个数都有极大的提高,使得更多的实验数据被观测到,测量的结果也就更加真实可信。可见论文研究的成果对于自容式海洋监测仪器的数据监测有很大的促进和提高。
图6 改进后钽丝测波仪波形图
[1]李忠民.ARM嵌入式VxWorks实践教程[M].北京:北京航空航天大学出版社,2006.
[2]陈智育.VxWorks程序开发实践[M].北京:人民邮电出版社,2004.
[3]何永琦,符欲梅.基于现场监测的嵌入式Flash文件系统的设计和实现[J].微计算机应用,2004,25(3):335-338.
[4]王慧,吴旭光.VxWorks在AT91FR40162上的BSP定制[J].单片机与嵌入式系统设计,2003(9):77-81.
[5]唐德波,杨斌,石禹.TrueFFS原理及其在Flash存储器上的应用[J].电测与仪表,2006,43(484):61-64.
Large Capacity Information Storage Method for Ocean Monitoring Equipments
MA Xin1,ZHANG Shi-yang2
(1.Key Laboratory of Physical Oceanography,Ocean University of China,Ministry of Education,Qingdao Shandong 266003,China;2.Department of Oceanography,Ocean University of China,Qingdao Shandong 266003,China)
Ocean exploration and military applications have put forward higher demands for ocean monitoring equipment.Especially imaging experiment phenomena with extension,manifold testing point and log data result in ocean monitoring equipments with small memory not suitable for applications.A method of data storage and transmission with the embedded operating system VxWorks and Ture Flash File System (TureFFS)drivers based on the NAND flash device is presented.To effectively manage the data files on the NAND flash storage chip of large capacity,a file system on the VxWorks system is designed to realize TureFFS communication with VxWorks dosFs on the ocean monitoring equipments.Thus,large capacity information storage of ocean monitoring equipment can be implemented.Finally,experiments using Tantalum thread wave measure equipment are conducted to verify the effectiveness.The scheme may be applied for other ocean monitoring equipment systems.
NAND Flash;VxWorks;BSP(board support package);TureFFS
P715;TP274
B
1003-2029(2011)04-0011-05
2011-04-17
马昕(1976-),男,工程师,主要研究方向为海洋监测仪器设计开发和物理海洋实验设计。