微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 嵌入式文件系统在工程机械监控器上的移植

嵌入式文件系统在工程机械监控器上的移植

时间:10-10 来源:互联网 点击:

摘要:在基于嵌入式操作系统的工程机械智能监控器的开发过程中,完成了文件系统的移植,将周立功公司的ZLG/FS文件系统经过一系列修改,嵌入到监控器的系统程序里运行。文件系统的硬件平台选用三星公司的Nand Flash芯片K9F2808,作为文件系统的硬件依托。文件系统移植完后该芯片就成为系统硬盘,用来存储系统程序和字库文件等。
关键词:文件系统;Nand Flash;嵌入式系统;移植;K9F2808

引言
文件系统是操作系统中组织、存取和保护数据的一个重要部分,文件系统的主要目标是提高存储器的利用率,接受用户的委托实施对文件的操作。在本工程机械智能监控器项目开发之初,文件系统这部分设计是由合作方北京航空航天大学完成的,当时使用的嵌入式文件系统是μC/OS—II。我方接手以后,对该文件系统进行了分析研究,发现该文件系统虽然能用,但是有些地方不够完善,存在一些问题和隐患:比如μC/OS-II内存占用比较大,且效率不高等。因此,又从网上下载了周立功文件系统(ZLG/FS),发现其非常适合监控器项目的使用,并且具备如下特点:
①高度兼容FAT12、FAT16、FAT32;
②可移植;
③支持多任务操作系统;
④兼容多种介质。
ZLG/FS采用模块化层次结构设计,并使用底层驱动程序来兼容不同的硬件结构和不同的介质。共包括6个模块:应用程序模块、文件管理与目录管理模块、文件分配表管理与文件目录表管理模块、逻辑盘管理模块、高速缓存(Cache)管理模块、底层驱动程序模块。最终决定将该文件系统移植到智能监控器系统上面。

1 硬件平台简介
本系统采用目标机+宿主机的开发模式,目标平台是ARM S3C44B0,宿主机是PC机+μC/OS-II操作系统。S3C44B0是基于ARM7TDMI内核的32位微控制器,它是三星公司专门为PDA、Internet设备和手持设备等开发的微处理器。该芯片还包含有8 KB的Cache,这一特性使开发人员能够将μC/OS-II操作系统移植到基于该处理器的目标系统中。

2 文件系统在智能监控器系统上面的移植过程
2.1 底层驱动程序的编写
硬件上,将三星公司的Nand Flash芯片K9F2808开发为系统硬盘。需要编写两部分的驱动程序:一是关于该Flash芯片的驱动程序,也就是对该芯片最底层的最基本的操作,建立文件Flash.c,包括Flash复位、读Flash ID号、擦除Flash的一块、读扇区、写扇区等函数,这部分函数代码由芯片公司提供;二是关于文件系统的基础操作,创建文件K9F2808.c,它调用flash.c里面的函数,为上层的程序提供一个与底层无关的接口。
文件K9F2808.c主要包括以下函数:创建FAT12、创建根目录、格式化Flash盘、将MBR写到盘里等。在格式化Flash盘这个函数里,首先要调用Flash复位的函数,然后擦除Flash盘的第0个Block,擦除成功以后,将MBR的内容写入该Block的第一个Page里,这是Flash盘的引导扇区,写入的MBR包含了该盘的一些基本信息。至此,完成了格式化盘的第一步,为后面继续格式化打下基础。
下一步就是要创建FAT12,用两个扇区(即两个Page)作FAT区,并将其内部单元全部初始化为00H,相继的2个扇区作FAT区的备份。接下来,把第1个Block擦除掉,然后在这个Block里创建该盘文件系统的根目录,并将根目录区初始化为00H。这样就把一个Flash盘给格式化为FAT12文件系统格式。但是还不能往盘里存东两,因为还需要一些文件系统上层的管理。
在K9F2808.c这个文件里,函数K9F2808(uint8 Cammand,vold*Parameter)是底层驱动程序与上层的接口函数,第一个参数代表要对该盘进行操作的命令,比如磁盘初始化、关闭磁盘、读扇区、写扇区等;第二个参数是一个结构体,它包含了当前操作的磁盘的一些读写基本信息。在文件系统的上层程序里这个函数将被频繁调用。
2.2 逻辑盘管理的程序移植
这是底层驱动程序上面一层的程序,文件名是disk.c,其中主要包含:磁盘初始化、读取磁盘信息、获取空盘信息、增加一个驱动程序。删除一个驱动程序等函数。这部分程序勿需改变,可以原封不动地延用ZLG—FS里提供的程序,在此不再赘述。
2.3 高速缓存管理的程序移植
这是FAT文件系统关于Cache管理的部分,文件名是RWSec.c,主要包括:初始化磁盘Cache、解锁指定Cache(允许切换出内存)、把指定扇区写回逻辑盘、把指定Cache写回逻辑盘、把所有已改变的扇区写回逻辑盘、从内存获取一个Cache、为逻辑盘上的一个扇区打开一个Cache并锁定、从逻辑盘读取一个扇区、指定逻辑盘的指定一个扇区被改写等。除了极个别的地方需要稍做修改外,这部分函数基本上都延用ZLG—FS里提供的程序。
2.4 文件分配表管理(FAT)的移植
文件Fat.c主要是FAT文件系统的文件分配表基本操作函数,包括:返回FAT表指定簇的下一个簇号、分配下一个簇、为指定簇链增加一个簇、删除指定簇链。这些函数可以放心大胆地使用,不需要修改。
2.5 文件目录表管理(FDT)的移植
文件Fdt.c是关于FAT文件系统的文件分配表基本操作程序。主要包括:将指定簇所有数据清零,读取FDT信息,写FDT信息,获取根目录指定文件(目录)信息,获取指定目录指定文件(目录)信息,设置根目录指定文件(目录)信息,设置指定目录指定文件(目录)信息,在指定目录查找指定文件(目录),在指定目录处增加指定文件(目录),在指定目录删除指定文件(目录),改变指定目录指定文件(目录)的属性,判断目录是否为空,在指定目录查看指定文件(目录)是否存在。除了对最后两个函数作了很小的改动外,其他函数都没用动。
2.6 文件管理的程序移植
这部分是关于文件系统的文件基本操作程序,主要包括:初始化文件指针系统,查找已打开的指定文件的文件句柄,删除文件,查找以读写方式打开的指定文件的文件句柄,只读方式打开文件,读写方式打开文件,移动文件读/写位置,以指定方式打开文件,关闭指定文件,从文件读一个字节,读取文件,写一个字节到文件,写文件,关闭所有打开的文件,判断文件是否读/写到文件尾,从文件指针当前位置读取一页,从文件指针当前位置写入一页。在这部分函数里,着重修改的是两个函数:读取文件FileRead()和写文件FileWrite()。第一个函数的原型是这样的:

不难看出,这个函数读取文件的时候是一个一个字符读的,而且每读一个字符都要从盘里读而不是从缓存里读,这样不仅速度慢,而且对磁盘的操作太频繁,容易减少磁盘的寿命。为了解决这个问题,对上述函数进行了修改。首先创建了一个新函数:从文件指针当前位置读取一页FileGetPage(),这个函数一次性最大能够读取一个Page大小的文件。然后,在FileRead函数里判断,如果要读取的文件大小不足一个Page,就用memcpy()这个库函数将文件里要读取的内容直接拷贝到缓冲区;如果要读取的文件超过一个Page,就计算出有N个Page,然后循环N次调用FileGetPage(),最后将不足一个Page的部分用memcpy()这个库函数去拷贝。
根据相同的思路,又创建了一个新函数:从文件指针当前位置写入一页FileWritePage(),并对ZLG—FS原来的FileWrite()函数进行了修改。通过实验发现,这样修改以后,大大提高了文件系统的读写速度。原来读取一个几兆的文件需要半个多小时,现在不到一分钟就可以完成了。
2.7 目录管理的程序移植
Dir.c文件是关于FAT文件系统的目录基本操作程序,主要包括:用户文件/目录名转换为系统名,获取FDT所在目录的开始簇号及系统内名称,获取指定目录的驱动器(驱动器号为0、1、2等),改变当前逻辑盘,获取指定目录开始簇号,建立目录,删除目录,改变当前目录。这里面有几个函数作过微小的修改,在此不细述。
2.8 文件系统在嵌入式系统上面的移植
在智能监控器中,使用的嵌入式系统是μC/OS—II。正好ZLG—FS提供了其文件系统在μC/OS—II上面的移植程序,就是文件OSFile. c,该文件里面的函数和File.c里面的函数功能类似,只不过都打上了μC/OS—II系统的烙印,这些函数都通过调用Together(a,b,c)来完成对文件的一些操作。Together(a,b,c)是为简化接口函数编写的一个宏。最后一个函数是OSFileTask(),该函数是在系统主程序里调用的,作用是创建一个文件系统服务任务,对文件的所有操作都可以在该任务里以命令的形式被执行。这一模块的程序基本不需要修改。

结语
在整个文件系统的移植过程中,首先要将文件系统里的程序全部吃透、消化,然后再根据自己的需要进行修改,边修改边做实验,通过这个过程还可以学习他人好的编程方法。移植完后,通过实验验证了嵌入式文件系统的移植效果良好、系统稳定。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top