VxWorks是一种的高性能实时操作系统,其强实时性、高可靠性、良好的可剪裁特性、友好的集成开发环境Tornado,使VxWorks成为实时操作系统中最有特色的操作系统之一。加之VxWorks对ARM系列芯片有着良好的支持,使其在军事、航天、通信、工业控制等诸多方面应用十分广泛。但是目前大多数的嵌入式软件开发人员都仅仅是开发了一些驱动程序,这样也可以让系统运行起来,然而仅仅做到这些是不够的,构建文件系统,采用文件系统的方式对各个程序加以细化的管理和操作,将更加有利于提高整个系统的效率和可靠性。 TrueFFS是一种硬盘仿真技术,TrueFFS应用程序能从闪存中读写,其过程如同从磁性介质的机械硬盘驱动器上的MS-DOS文件系统中读写一样。TrueFFS用磨损测评技术和无用单元收集算法,像硬盘一样最合理的分配和使用每一个区块,减少了区块迁移和区块过度使用,让闪盘更可靠、使用寿命更长。可以在许多嵌入式系的DOC中得以广泛应用。 VxWorks操作系统在文件系统与设备驱动程序之间使用一种标准的I/O操作接口, 这样使得在单个VxWorks操作系统中可以运行多个相同或者不同类型的文件系统。依据这些标准接口协议,用户可以为VxWorks操作系统编写自己的文件系统,并且可融入自己编写的设备驱动程序,以实现两者的自由组合。有较高的灵活性和可扩展性。 1 软件结构 Window下的文件系统如FAT、NTFS往往不适合用在嵌入式应用系统中,因为第一:嵌入式应用系统工作条件往往比较恶劣。第二:实际的嵌入式应用系统往往资源很有限、不便于支持大型的文件系统。第三:闪存的过编程易造成闪存的损坏。 VxWorks中可支持的文件系统有:dosFs文件系统、TrueFFS文件系统(TrueFFS支持闪存设备)、rawFs文件系统、tapeFs文件系统、cdromFs文件系统、TSFS目标服务器文件系统。其中dosFs文件系统适合于块存储设备的实时操作,与MS-DOS文件系统兼容。TrueFFS提供面向多种闪存设备的块设备接口,可以重进入、线程安全、并支持所有装载VxWorks的CPU结构。由于闪存非常适合移动设备、手持设备和大多数的嵌入式系统,而这些要求对于机械硬盘而言则难以满足。TureFFS与dosFs文件系统是兼容的所以很有实用价值。 TureFFS与dosFs的区别在于TrueFFS不支持分区表,也不支持ioctl。值得注意的是,Tornado的这个版本支持SSFDC规范的NAND器件,但不支持NOR器件。VxWorks中的软件体系结构如图1所示。 至底向上依次是硬件设备、块存取设备、文件系统、设备驱动、应用程序。硬件设备是闪存、DRAM、串口、网口等;块存取设备驱动程序主要是面向设备的启动层;文件系统主要有dosFs和TrueFFS,这部分是非常重要的,一个良好而高效的嵌入式系统必须要有这样一个或者多个文件系统。接着是I/O系统接口,VxWorks操作系统中的I/O系统可以提供简单、统一、与任何设备无关的接口,包括基本I/O和缓冲I/O系统,适应高实型的要求。最顶部是用户的编写应用程序与下层的代码也不直接与硬件联系。 2 TureFFS层次架构 图2 TrueFFS具有分层结构 1.核心层:该层将其他各层连接起来,并处理全局事务,如后台处理、碎片搜集、计时器和其他系统资源,核心层只有二进制形式。 2.转换层:该层包含了存储媒质的文件系统视图与闪存擦除之间的映射。转换层只有二进制形式。 3.MTD层:MTD执行闪存媒质的低级编程(映射、读、写、擦除),MTD具有源代码和二进制形式。 4.Socket层:Socket层提供TrueFFS与板级硬件之间的接口,提供指定板硬件的存取程序。Socket驱动程序只具有源代码形式。 3 构建支持TrueFFS系统的步骤 ① 选择MTD组件,MTD是软件模块既可以用WINDRIVER公司的产品也可以用户自己编写。MTD支持的闪存设备有CFI接口的也有SCS接口,根据自己的Flash芯片,决定采用什么样的BSP组件。 ②确定Socket驱动程序、sysTffs.c文件中执行、在相应的BSP中也要有所定义。 ③配置系统。添加dosFs和其他组件。并且必须要有一个核心组件INCLUDE_TFFS。 ④构建项目。在这里包含多种组件,主要是与选择的Flash种类有关,各种公司生产的闪存设备都对应了不同的组件。如INCLUDE_MTD_AMD就是包含AMD、Fujitsu的闪存设备。 ⑤引导目标机以及格式化驱动程序。 ⑥安装驱动程序。使用usrTffsConfig()函数将文件系统安装在TrueFFS闪存驱动器。 ⑦检测驱动程序。确保文件操作的正确性。启动系统,注册Socket驱动程序后,调出shell程序,用tfsDevFormat()格式化Flash。由于系统中有一部分是下载的系统映象文件,所以这部分区域不能被格式化,所以创建启动镜像区域是有必要的。 4 闪存驱动程序设计 这部分的程序应该放在MTD层中实现。通用设备驱动程序是放在子程序usrRoot()中、而BSP专用设备驱动程序是放在子程序sysHWInit()中。硬件的行为和特性是通过内部寄存器来控制的,对内部寄存器的访问,有两种方式,I/O方式和存储器映射闪存方式,在ARM系统里把外设I/O与内存统一编址。驱动程序是界于硬件和上层应用软件之间的低层程序代码,驱动程序负责低层硬件和上层应用程序间的数据交换,直接面向硬件操作。驱动程序写得好则使得上层应用程序的工作量相对减少很多。为防止阻塞,在驱动程序中设置状态检查至关重要,对硬件操作延时必然会产生,延时可以测出,通过时间判断延时和死机等异常情况,从而做出相应处理。对Flash可以分扇区擦除也可以整片擦除,对闪存的写数据其实也是先擦除再写入,读出数据也是分块读出数据,可以按照周期时序规则对指定的寄存器写入指令和读出或者写入数据。尽量循环擦除以避免造成闪存某一个区域的过编程,这样可以有效利用各个块的存储空间也可以延长寿命。还必须注意数据的长度和数据类型的选择,使内存地址必须对齐,否则可能造成系统不可预知的问题。下面是部分代码。 //定义_厂各种指令代码 #define FLASH_CMD_FIRST 0xaa #define FLASH_CMD_SECOND 0x55 //定义了总线周期地址 #define FLASH_REG_FIRST_CYCLE *(unsigned short *)(0x2000000+0x555*2) #define FLASH REG_SECOND_CYCLE *(unsigned short *) (Ox2000000+Ox2aa*2) #define FLASH_CMD_PROGRAM1 0x80 #define FLASH_CMD_PROGRAM2 0x10 …… //flash按扇区擦除 STATUS sysFlashEraseSector(unsigned int addr) //flash整片擦除 STATUS sysFlashChipErase(void) //flash读出整块数据 void FLASH_READ(unsigned int addr,unsigned short int * pread,int nwords) //flash写入整块数据 STATUS sysFlashWrite (unsigned short int data,short int size, unsigned int addr) …… 为了尽可能的延长使用寿命,TrueFFS使用了一种称为磨损测评的技术和无用单元收集算法。磨损测评可以缓解“过编程”的现象,平衡整个介质的磨损情况,使每个单元的擦除次数近似相等。无用存储单元收集技术对已经擦除块进行再次声明,便于循环使用。 5 小结 本文介绍了TrueFFS文件系统的建立过程,分析了各个层次架构,介绍了Flash驱动程序。因为现在的嵌入式系统目标板上,普遍都有Flash作为引导启动和数据存储的设备,所以对这部分数据实现文件方式的有效的管理很有必要。采用TrueFFS硬盘仿真技术对Flash进行管理,可以把Flash模拟成硬盘,也正是因为采用了TrueFFS技术对数据在Flash中的读写操作进行管理,大大提高了写的次数,提高了Flash的可靠性,延长了使用寿命。
|