声波测井仪器井下数据文件系统设计
2020-01-07付绍凯卢俊强鞠晓东陈光建门百永
付绍凯,卢俊强,鞠晓东,陈光建,门百永
(1.中国石油大学(北京)油气资源与探测国家重点实验室,北京102249;2.北京市地球探测与信息技术重点实验室,北京102249;3.中国石油集团测井有限公司生产测井中心,河北任丘062552)
0 引 言
与传统电缆测井不同,在随钻声波测井中,测井仪器需要在井下独立工作,地面测井系统无法对井下仪器进行控制,所有的仪器工作模式和数据采集、处理都需要井下控制器完成[1]。并且受泥浆传输速率的影响(中国5 bit/s左右),除少量必要的处理结果被实时传输到地面系统外,大量处理结果和原始测量波形数据是被存储在仪器存储器内[2]。与传统声波测井仪器相比,新型声波测井仪器向着规模化、阵列化的成像测井仪器发展,这一方面提高了仪器探测深度和精度;另一方面也大大增加了测井数据量。由于数据量的大增,目前遥测系统已不能完成数据的实时传输,所以测井时仅上传部分数据作为观测,所有测井数据存储在井下存储器内。
将数据存储在井下存储器上,面临的另一个问题就是数据的存储和读取方式。受测井条件高温高压和振动等因素的影响,井下存储器一般选用大容量非易失性的NAND Flash存储器。目前,中国声波测井仪器井下存储几乎未采用文件系统进行测井数据的有效管理,而是采用直接驱动物理存储器的方式进行数据操作。受NAND Flash结构限制,采用地址、数据和命令复用的接口形式,只能按页进行数据的写入和读取,且复写数据前需要以块为单位擦除后才能写入。在进行仪器开发时,开发人员直接面对的是底层驱动的开发,而且仪器设计后,必须详细说明数据的写入及读取方式,供后续软件和地面系统开发人员进行下一步开发。这种方式不仅数据管理复杂、使用灵活性差,还会加大仪器开发的周期、增加数据存取过程中的错误。为更好满足越来越复杂的井下存储的需要,有必要将“文件系统”引入声波测井仪器对测井数据进行文件式管理,实现数据的“按名存取”。
1 系统硬件设计
声波测井仪器井下数据文件系统是基于DSP+FPGA+NAND Flash的硬件平台实现的(见图1)。该硬件平台主要实现了测井的数据采集、实时处理和数据的存储控制。井下存储控制电路以DSP(digital signal process)控制器为核心,设计选用TI公司的32 bit浮点处理器TMS320F28335。以DSP为核心,通过外部存储器接口(XINTF)扩展FPGA接收命令实现对NAND Flash的数据、地址和命令信号的控制[2],实现测井数据的写入和读出。通过XINTF接口扩展SRAM实现对DSP程序和数据空间的扩展。通过扩展CAN总线模块和SCI模块实现存储控制电路与前端机和上位机的命令、数据的交互。
1.1 SRAM接口设计
TMS320F28335的XINTF接口可以分别映射到3个固定的存储器映射区域Zone0/6/7,通过片选信号置低控制每个区域。XINTF接口可以通过软件编程设定独立的等待时间、保持时间和选通信号的建立时间。XINTF接口共有31根数据线、20根地址线及片选、读写使能、输出时钟等信号线[3-4]。设计选用CYPRESS的256 kB×16 bit的SRAM芯片映射到区域7。为提高电路的复用性,设计了XA0~XA18共19根地址线分别与XINTF接口的地址引脚相连,因此也可使用512 kB×16 bit的SRAM。SRAM的IO0-15分别连接XINTF接口的XD0~XD15引脚,SRAM的片选、读/写信号线分别连接XINTF接口的XZCS7/XWE/XRD引脚,高低字节选择BHE和BLE直接接地。
1.2 Flash接口设计
井下存储板选用的是SAMSUNG公司的K9**M[5]型NAND Flash。K9**M包括I/O0-7数据输入输出、命令/地址使能、片选、读/写使能、写保护、忙状态等引脚。NAND Flash接口的设计稍微复杂,DSP没有NAND Flash接口,通过FPGA扩展实现:FPGA通过XINTF接口接收DSP的命令和数据,控制整个NAND Flash的操作,包括片选、命令、数据、地址的选择,而NAND Flash读写信号是直接由XINTF接口的读/写控制信号XRD和XWE控制,输入输出引脚I/O0~I/O7直接接XINTF接口的XD0~XD7引脚。
1.3 通讯接口设计
图1 井下存储控制电路结构图 图2 井下数据文件系统软件结构图
(1)CAN通讯接口。设计井下存储控制电路时,为了能够兼容EILog测井系统,系统设计了CAN通信模块。F28335中集成了2个增强型CAN总线控制器eCAN。eCAN集成了CAN协议的物理层和数据链路层功能。CAN总线使用差分电压进行信号传送,为了使CAN模块的电平符合高速CAN总线电平特性,在eCAN模块和CAN接口之间增加CAN的驱动芯片MAX305X,实现单端和差分信号的转换。为了抑制总线回波折射,在差分信号CAN_H和CAN_L之间串联120 Ω的电阻作为终端匹配电阻,当该设备不作为终端时,可以摘除跳帽。
(2)RS232及RS485通讯接口。串口通信接口SCI采用2根信号线的异步串行通信接口。F28335集成了3个SCI接口,在井下存储控制电路中,扩展了其中2路SCI接口:一路用作监测设备运行状态;一路作为井下数据与上位机的传输通道。作为监测作用的SCI,只是简单的将SCIC接口进行扩展,与上位机进行串口通信。而作为数据通道的一路采用的是RS485接口,井下电路选用SN65LBC184D芯片作为驱动芯片将SCIB扩展为RS485接口。
2 系统软件设计
在嵌入式设备中很难应用基于Linux环境开发的JFFS系列和YAFFS系列[6]等专用文件系统。考虑到井下仪器管理数据的特殊性,只需要实现测井数据的文件化管理。本文提出了井下数据文件管理系统分层实现的软件结构思路:移植嵌入式FatFS文件系统到DSP中,通过设计闪存转换层(FTL)[7]实现FatFS对NAND Flash存储器的管理,从而实现了在NAND Flash上稳定运行FAT型文件系统。
井下数据文件系统软件结构见图2。整个系统从上到下包括3部分:顶层应用层作为用户接口层,给用户提供必要的API函数,实现对文件系统进行管理和开发;文件管理层是井下文件系统的具体实现部分,主要包括FAT层和FTL层;底层驱动层作为底层物理设备接口层,是根据底层具体物理设备实现文件管理层预留的读写接口函数。
2.1 文件管理层设计
2.1.1FAT层实现
FatFS的FAT文件系统[8]支持FAT12/16/32。标准C编写,不受硬件平台限制,易于移植。代码量小,且支持多种配置。基于FatFS文件系统的FAT层移植主要包括以下3步[9]。
第1步数据类型修改,修改源码中数据类型头文件,使其定义的数据类型与F28335的开发环境CCS5.2编译器相对应。第2步配置选项修改(见表1)。第3步编写底层接口,底层磁盘I/O与FatFS模块是完全分开的,需要编写表2所示的6个接口函数:底层物理磁盘的读、写和获取当前时间等函数。
表1 FatFS配置选项
表2 FatFS底层接口函数
通过以上3步,基本完成了FatFS的移植工作,但是要实现FatFS文件系统管理NAND Flash存储器,还需要完成闪存转换层的设计。
2.1.2FTL层设计
为在NAND Flash上运行块设备文件系统,需要在底层NAND Flash设备之上设计FTL层,使FatFS文件系统像控制磁盘设备那样管理NAND Flash存储器。由于NAND Flash的物理特点和使用要求的独特性,在设计FTL层时需要包含以下几个功能模块[7]:地址映射、坏块管理、ECC纠错、均衡擦除等(见图3)。
(1)顶层接口。它是针对FatFS文件系统底层给用户预留的接口,主要包括3个函数(见表3):初始化函数、写指定扇区函数和读指定扇区函数。这3个函数供FatFS文件系统中的底层调用。
表3 FTL顶层接口函数
图3 FTL结构图
(2)地址映射。由于NAND Flash在出厂和使用过程中可能会出现坏块且数据更新采用异地更新策略,造成了物理地址的不连续性,因此,需要将逻辑地址动态的映射到物理地址上。地址映射按照映射单位可以分为页映射、块映射和混合映射[10]。考虑到井下控制器内存资源有限,采用块映射方式。
图4 系统映射关系
程序中通过在逻辑地址和物理地址之间维护一张映射表实现块映射,如图4为某一时刻系统映射关系。程序中采用直接映射和间接映射实现物理-逻辑映射:上电后,扫描整个NAND Flash在RAM中建立映射表为直接映射。断电后,该映射表需要存储到NAND Flash中,以便每次上电后重建而不丢失。系统是将该映射表存储在每个Block的第1个Page的空闲区,称为间接映射。空闲区的分配情况见表4。
(3)坏块管理。NAND Flash中的坏块不能被映射到逻辑地址,所以必须对坏块进行标记并保存,避免使用坏块。NAND Flash中坏块存在的形式主要有2种:①出厂时存在的固有坏块;②在使用过程中产生的动态坏块。对于出厂坏块,通常在每个坏块的第1个Page(第2个备份)的空闲区的第1个字节以非0xFF的值来表示。对于动态产生的坏块,通过在第1个Page的空闲区第1个字节写入0xAA进行标记。
表4 空闲区分配表
常用的坏块管理技术有2种[11-12]:①坏块跳过,这种方法实现简单,但占用内存大、耗时长且不能实现坏块的透明化管理;②块保留区替换法。系统采用的是保留区替换法,通过将所有块划分为数据区和保留区(见图4)。程序中设定数据区占93%,保留区占7%。数据区用于正常的逻辑映射进行数据存储,保留区作为产生坏块时的替换区域。当产生坏块后,就将该坏块的逻辑地址映射到保留区有效块的物理地址上。通过这种方法简单、高效的实现了坏块的管理。
(4)ECC纠错。NAND Flash由于自身物理结构和工作原理的特点,存储单元可能会出现“位反转”现象,造成写入数据与读出数据的不一致[13]。
ECC(Error Checking and Correction),是一种对传输数据的错误检测和纠正的算法。K9**M为SLC结构,基于Hamming Code的ECC校验能够满足SLC结构Flash的纠错要求。Hamming Code是通过计算数据包得到2个ECC校验值(奇校验值和偶校验值),为了计算ECC校验值,首先需要将数据包数据进行分割,按1/2组、1/4组、1/8组直到其精度达到单比特为止。然后按分组后形成的奇数组和偶数组后分别组内异或,最后按1/2组异或结果构成ECC校验的最高位,依次类推分别得到偶校验值和奇校验值。在数据读取时将2次ECC校验数值进行按位“异或”,就可以判断是否出现错误。如果计算结果为全“0”,说明数据在读写过程中未发生变化。如果计算的结果为全“1”,表明发生了1 bit错误,其他情况,则表明至少有2 bits数据出现了错误。将原有奇校验值和新奇校验值进行按位“异或”可以得到出错地址。
以512 B为数据包计算ECC校验值,将会产生24 bits的校验值,即3 B(212=4 096 bit=512 B,12×2=24 bit)。系统将ECC校验值存储在NAND Flash中的空闲区中,为了便于写入和读出,采用3 B+1 B的形式进行存储,即第4个字节默认为0xFF。设计采用的NAND Flash存储器是4 kB大小的Page,需要32B来存储1个Page生成的ECC校验值。表4为ECC校验值在空闲区的分配情况。
(5)均衡摩擦。由于NAND Flash每块的擦写次数有一定上限,如果频繁对某一块进行擦写会导致该块提前达到上限成为坏块,从而影响整片Flash的性能。在设计闪存转换层时应采用必要的负载均衡算法[14],使擦写均匀分布在各块上,从而提高整片Flash的性能,延长其使用寿命。考虑到声波测井井下数据存储的实际情况,系统主要从空闲块搜寻和复写数据2个方面实现存储器的均衡摩擦。
空闲块搜寻[15],FTL采用随机数产生函数rand()和种子函数srand()生成指定范围内的随机数。以时间为种子,那么每次产生的随机数将是随机的。当系统需要分配1个空闲块时,就从产生的随机数开始搜寻空闲块,这样使空闲块有均等的机会被分配使用,从而实现了一定程度上磨损均衡。
(6)复写数据。当文件系统向某一已经写过数据的数据块中写入新的数据时,由于NAND Flash必须先擦除块才能写入新数据,一般是将整块数据读到缓存中,然后在缓存中改写需要写入的新数据,擦除该块,再将缓存中的数据重新写入该块。这种方式,一是非常耗时;二是会对某一块频繁进行擦写;三是就设计使用的NAND Flash而言单块大小为(256+8) kB,如果将整块数据读到缓存中将耗费大量RAM空间。所以在设计FTL时,利用NAND Flash的同一plane内页拷贝的功能,无需将整块数据读出,只需要在页拷贝的过程中,在需要改写的地址处写入需要更新的数据就可实现数据的复写。作为页拷贝的目的块,系统是通过搜寻空闲块实现的。这样的设计不仅提高了复写数据的效率,另外也在一定程度上实现了均衡摩擦。为了能够不频繁擦除某块提高整片Flash的寿命,应该预留足够的保留块。
(7)底层接口。底层接口是和底层硬件相关的具体实现函数,FTL提供的底层接口主要是供给用户针对具体硬件设备的初始化、读写页、擦除块和页复制等函数接口。
2.2 底层驱动层实现
根据设计使用的底层物理设备K9**M NAND Flash,编写闪存转换层预留的底层接口函数[5]。
NAND Flash初始化。①对NAND Flash进行复位;②读取设备ID,并与已设定ID比较,若相同则进行相应参数的设置(页大小、有效数据区大小、空闲区大小、单块包含页数、1个plane包含的block数、总块数等),若没有相同项则初始化失败。
写入物理页。通过NAND Flash写入命令实现数据写入,除了写入数据外,还针对NAND Flash的物理特性,设计了ECC校验功能,通过调用校验函数求取ECC校验值,利用随机写入命令将ECC校验值写入到空闲区中。
读取物理页。通过NAND Flash读取命令,实现数据读取,另外利用随机读取命令读取空闲区ECC校验值。将读取后的数据进行ECC校验产生ECC校验值,与存储在空闲区的ECC校验值进行比较,可以得出是否发生位反转错误,如发生1 bit错误,则可以通过纠错函数将数据纠错,如果发生2 bit的ECC校验错误,则会报告的2 bit ECC数据错误。
擦除块。先写入擦除命令1,然后写入根据块号换算的块地址,最后写入擦除命令2,通过写入状态命令,获得I/O的0值即可判断擦除是否成功。
Plane内页拷贝。页拷贝分为有数据写入和无数据写入2种,在有数据写入时还需要进行ECC校验值计算,将ECC校验值写入空闲区。
2.3 顶层应用层开发
顶层应用层是系统为用户提供一系列API函数,是供用户开发、管理系统的接口层。该系列API函数是针对井下数据文件系统的具体需求对FatFS文件系统的接口函数层进行进一步封装形成的,便于用户调用,图5为井下数据文件系统通用的开发流程。
图5 井下数据文件系统开发流程
3 测 试
(1)性能测试。文件系统的读写速度是用户最关心的性能,该文件系统的读写速度测试结果见表5。
(2)应用测试。以中国石油大学(北京)声波测井实验室研制的方位远探测反射声波测井仪[16-17]为例,对该系统进行实际应用测试,该仪器接收短节共有10站,每站有8个通道,共有80个接收通道。在常规测井单极、偶极均工作的情况下,单次工作每个通道会产生4 kB的数据,则接收短节产生的数据量多达320 kB。以测量200 m井段为例,仪器每米采集5个点,则将产生312 MB的数据量。
将采集数据连续存入同一文件中,通过文件系统对该文件连续写入400 MB数据(多于实际测井数据量),共用时14 min 50 s(460 kB/s)。将写入数据全部读出,共用时11 min 31 s(593 kB/s)。数据准确率符合测井要求。
表5 读写速度测试
4 讨 论
从性能和应用2个方面对该文件系统进行相应测试,结果表明井下数据文件系统完成了最初设计的要求。该系统能够向用户提供必要的API函数实现对文件系统的管理,包括新建文件、文件读/写、文件删除、获取文件大小、获取根目录下文件名等功能,从而实现了以文件形式管理井下测井数据。在读写速度方面,以目前仪器的采集速度和仪器设计的数据上传速度,该系统实现的平均412 kB/s写入速度(非复写)和583 kB/s的读取速度能够满足声波测井仪井下数据的存储要求。作为目前声波测井中采集数据量最大的方位远探测反射声波测井仪,该系统也能够实现对大容量文件连续写入和读出操作,满足测井仪器上的实际应用。
由于井下数据文件系统不同于普通嵌入式文件系统,井下高温高压环境再加上资源有限限制了文件系统设计,进一步提高该文件系统的稳定性是其中一项重要任务。另外,随着声波测井仪器的进一步发展,对读写速度的要求也会越来越高,深入研究闪存转换的关键技术是解决该问题的突破口。
5 结束语
在中国声波测井仪器尚未引入以文件系统的形式管理井下数据的背景下,本文以嵌入式文件系统FatFS为基础设计了一款适用于井下数据存储管理的分层结构的文件系统,详细介绍了井下数据文件管理系统的实现过程,并进行相应测试。测试结果表明该系统实现了最初的设计要求,系统提供了一系列API函数使用户能够以文件的形式对井下数据进行管理,很大程度上提高了数据管理的稳定性。“文件系统”的引入是目前声波测井仪器井下数据存储管理的有效解决方案,该设计的实现不仅有利于提高声波测井仪器的开发和升级效率,同时也对其他测井仪器的井下数据管理方案提供了参考。后续的研究可以从FTL层关键技术设计方面进一步提高系统的读写性能和稳定性。