摘要:目前的嵌入式系统多使用flash作为主存,因此,如何有效管理flash上的数据非常重要。文章以mx29lv160bt芯片为例,讨论了在vxworks操作系统下norflash上建立tffs文件系统的一般步骤,从而为flash上的数据管理提供了理想的选择方式,同时也为开发者和用户升级程序提供了方便。
嵌入式系统正随着internet的发展而在各个领域得到广泛的应用,作为一个优秀的操作系统,vxworks实现了比其他实时操作系统更好的有效性、商用性、可裁减性以及互操作性,广泛应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。
如今越来越多的嵌入式操作系统中,通常都使用flash作为主存介质。许多开发者和用户为了方便以后升级用户程序,通常在flash上建立tffs文件系统,建立文件系统后,我们就可以象在windows操作系统下对硬盘操作一样,进行数据的拷贝、删除以及文件的建立等操作。
nor和nand是现在市场上两种主要的非易失闪存技术。intel于1988年首先开发出norflash技术,彻底改变了原先有eprom和eeprom一统天下的局面。nor的特点是芯片内执行xipexecuteinplace,这样应用程序可以直接在flash闪存内运行,不必再把代码读到系统ram中。nor的传输效率很高,在1~4mb的小容量时具有很高的成本效益,因此在嵌入式系统得到广泛的应用。
一、tffs文件系统结构简介
tornado的trueffs是和vxworks兼容的一种m-systemsflite实现方式,版本为2.0。它为种类繁多的flash存储设备提供了统一的块设备接口,并且具有可重入、线程安全的特点,支持大多数流行的cpu构架。有了tornado的trueffs,应用程序对flash存储设备的读写就好象它们对拥有ms-dos文件系统的磁碟设备的操作一样。
如图1所示,trueffs由核心层(corelayer)和三个功能层,翻译层(translationlayer),mtd层(mtdlayer),socket层(socketlayer)组成。
核心层(corelayer):核心层主要起相互连接其他几层的功能。同时它也可以进行碎片回收、定时器和其他系统资源的维护。通常windriver公司将这部分内容以二进制文件提供。
翻译层主要实现trueffs和dosfs之间的高级交互功能。它也包含了控制flash映射到块、wear-leveling、碎片回收和数据完整性所需的智能化处理功能。目前有三种不同的翻译层模块可供选择。选择哪一种层要看你所用的flash介质是采用nor-based,还是nand-based,或者ssfdc-based技术而定。
socket层则是提供trueffs和板卡硬件(如flash卡)的接口服务。其名字来源于用户可以插入flash卡的物理插槽。用来向系统注册socket设备,检测设备拔插,硬件写保护等。后面将详细讲解它的功能。
mtd层(memorytechnologydrivers)功能主要是实现对具体的flash进行读、写、擦、id识别等驱动,并设置与flash密切相关的一些参数。trueffs已经包含了支持intel,amd以及samsung部分flash芯片的mtd层驱动。新的芯片需要新的mtd支持,你可以使用一个标准的接口来加入这些驱动。
以上四部分,我们通常要的工作就是后两层。
当在vxworks下配置trueffs时,你必须为每一层至少包含一个软件模块。后面我们将详细讨论。
二、mx29lv160bt芯片上建立trueffs文件系统
1、配置相关文件
在此,我以norflashmx29lv160bt为例,开发工具为tornado2.2forppc。要在vxworks映像中包含trueffs文件系统,首先必须在config.h文件中定义include_tffs。这使得vxworks的初始化代码调用tffsdrv()来创建管理trueffs所需的结构和全局变量,并为所有挂接了的flash设备注册socket组件驱动。在链接的时候,通过解析与tffsdrv()相关联的符号(symbols)可以将trueffs所必需的软件模块链接到vxworks映象中。
为了支持trueffs,每一个bsp目录下都必须包含一个systffs.c文件。它将trueffs所有的层(翻译层,socket层和mtd层)链接到一起并和vxworks绑定。因此,我必须编辑这个文件并决定哪一种mtd和翻译层模块应该包含到trueffs中。即:
#defineinclude_mtd_mx29lv/*mx29lv160btmtddriver*/
#defineinclude_tl_ftl/*ftltranslationlayer*/
#defineflash_base_adrs0x2a10000/*flashmemorybaseaddress*/
#undefflash_size
#defineflash_size0x001f0000/*flashmemorysize,2m(parameterblock)*/
其他无关的mtddriver包含头都#undef掉,同时定义flash在系统中的基地址和大小。另外,还必须编辑syslib.c中的sysphysmemdesc[]数组,将flash基地址和大小加入到mmu中,以供将来访问flash,否则访问flash会失败。如果bsp目录下没有systffs.c文件,那么我们可以从其他bsp目录下拷贝一个即可,然后做上述修改,其他的内容基本可以不用修改。
接下来需要修改tffsconfig.c文件,为了方便管理,通常我们将src/drv/tffs/目录下该文件拷贝到我们bsp目录下,然后再做出修改。在mtdidentifyroutinemtdtable[]表中加入如下语句:
#ifdefinclude_mtd_mx29lv
mx29lvmtdidentify,
#endif/*include_mtd_mx29lv*/
并在该文件开头声明。
#ifdefinclude_mtd_mx29lv
flstatusmx29lvmtdidentify(flflashvol);
#endif/*include_mtd_mx29lv*/
最后就是将我们的flash相关mtd驱动加入到makefile中。即:
mach_extra=mx29lvmtd.o
为了方便我们调试mtd驱动,应该在重新编译vxworks映象前将诸如格式化flash、创建trueffs块设备、绑定此块设备到dosfs所必要的功能包含到vxworks映像中。比如如下定义:
#defineinclude_tffs
#ifdefinclude_tffs
#defineinclude_tffs_dosfs
#defineinclude_tffs_show
#defineinclude_dosfs/*dosfsfilesystem*/
#defineinclude_show_routines/*showroutinesforsystemfacilities*/
#defineinclude_tl_ftl
#defineinclude_io_system
#defineinclude_disk_util
#endif/*include_dosfs*/
2、mtd驱动简介
做了上述配置后,进入vxworks操作系统后,我们在shell上利用tffsshow工具来显示flash的信息。tffsshow函数最终会调用mtd驱动中的mx29lvmtdidentiy()函数,在mx29lvmtdidentiy()函数主要是通过读取mx29lv160bt芯片的设备和厂商id来识别它,然后对flflash结构成员进行初始化,最主要的几个参数是:
type
flash内存的jedecid号。
erasableblocksize
flash内存的擦除块大小(字节)。设置这个值时应考虑到interleaving。因此,通常通过如下方法来设置它的大小。
vol.erasableblocksize=mx29lv_mtd_sector_size*vol.interleaving;
对于mx29lv160bt,mx29lv_mtd_sector_size为64k字节。
chipsize
使用来构建trueffs文件系统的flash实际大小(字节)。
noofchips
使用来构建trueffs文件系统的flash实际片数。
interleaving
flash内存交叉因子(interleavingfactor)。即扩展数据总线的设备数。比如,一个32位数据总线上,我们可以使用4片8位或2片16位的设备。
map
指向flash内存映射(map)函数。该函数将flash映射到内存区。
read
指向flash内存的读函数。在mtd驱动识别函数中,这个成员函数已经被初始化为缺省的读函数。通常情况下,我们不需要再初始化它,否则还需要修改很多相关的函数。
write
指向flash内存的写函数。这个成员必须初始化,这是我们要做的一个重要工作。
erase
指向flash内存的擦除函数。这个成员必须初始化,这也是我们要做的一个重要工作。
针对flflash结构成员,我们所关心的两个函数就是写和擦除函数。在mx29lvmtdidentiy()函数中必须有如下定义:
vol.write=mx29lvwrite;
vol.erase=mx29lverase;
在mx29lvwrite()函数中主要是实现将数据写到flash中。首先需要对扇区进行解锁,然后写入写命令,之后才能进行数据的写入。最后需要判断数据是否写完。为了确保操作成功,我们应该在写完每个数据后进行数据的比较,比较正确后方能进行下一个数据的操作。
在mx29lverase()函数中主要是实现flash扇区的擦除。如今的flash一般都是按照扇区进行擦除操作的。在擦除操作之前也应该首先对扇区进行解锁,然后写擦除建立和扇区擦除命令。擦除成功后,flash中的内容应该是0xffff。所以为了确保成功,我们还是应该在擦除后进行比较,比较正确后方能进入下一个扇区的擦除操作,否则返回擦除错误标志。
所以,对于mtd驱动的调试,基本上就是调试写和擦除两个函数。在调试过程中,我们可以在这两个函数相应位置加入打印语句来调试。为了能调试这两个函数,我们通过在shell上输入命令tffsdevformat来格式化flash,tffsdevformat最终会调用mx29lverase和mx29lvwrite函数,如果成功就会返回0,否则返回-1。当然也可以调用tffsdevcreate函数来验证我们的写和擦除函数的正确性。图2说明了tffsdevcreate调用过程。
在shell上利用tffsshow来验证mx29lvmtdidentiy。
ètffsshow
0:socket=rfa:type=0x2249,unitsize=0x10000,mediasize=0x1f0000
value=49=0x31=1
说明已正确识别到mx29lv160bt设备,设备号为0x2249。
三、建立tffs设备
1、挂接设备名
mtd驱动调试成功后,我们就可以给flash设备挂接上dos设备名,如下操作:
格式化:
ètffsdevformat
value=1
èusrtffsconfig0,0,”/tffs0”
value=0
然后通过devs来查看挂接的设备名。
èdevs
drvname
0/null
1/tyco/0
1/tyco/1
5host:
6/pty/rlogin.s
7/pty/rlogin.m
3/tffs0/
8/vio
value=25=0x19
看到/tffs0/说明挂接设备已经成功,接下来就可以利用dosfs文件系统相关命令来操作flash了。如,ls、copy等。
2、从flash中启动并下载vxworks映像
要从flash中下载vxworks映像,首先需要把vxworks映像拷贝到flash中,在shell中的操作命令为copy“vxworks”,”/tffs0/vxworks”,然后修改config.h文件中引导行,如下:
#definedefault_boot_line\
tffs=0,0(0,0)host:/tffs0/vxworksh=192.168.0.153e=192.168.0.154u=targetpw=targeto=cpm
修改完后,重新编译生成bootrom_uncmp.bin,并把它烧写到flash中(注意:该flash与上面建立tffs文件系统的flash不一样,它并没有建立文件系统)。然后重新启动,即可看到如下启动画面:
bootdevice:tffs=0,0
unitnumber:0
processornumber:0
hostname:host
filename:/tffs0/vxworks
inetonethernet(e):192.168.0.154
hostinet(h):192.168.0.153
user(u):target
ftppassword(pw):target
flags(f):0x0
other(o):cpm
attachingtotffs...done.
loading/tffs0/vxworks...894304
startingat0x10000...
developmentsystem
vxworksversion5.5.1
kernel:windversion2.6
copyrightwindriversystems,inc.,1984-2003
cpu:motorolaads-powerpc860.processor#0.
memorysize:0x1000000.bspversion1.2/5.
wdbcommtype:wdb_comm_end
wdb:ready.
到此,说明引导成功。flash整个tffs文件系统就已经建立成功。
四、结论
vxworks操作系统中支持tffs文件系统,我们将vxworks映像作为文件放到flash上,这就有利于开发者和用户更新应用程序而不需要影响bootrom,直接更新vxworks映像或者将应用程序直接copy到flash中,然后装载到ram中运行。
数字原理技巧超详细介绍教学
什么是电池管理系统(BMS)的算法?
CES 2011智能手机六大看点
5G网络的速度之快能为VR/AR行业带来什么
医疗心电仪更多采用工业安卓一体机
嵌入式操作系统VxWorks中TFFS文件系统的构建
荣耀9X新配色魅焰红版正式发售及全职高手定制礼盒
ETBC上线ModernEx新时代交易所
电流传感器集成电路(IC)磁滞减轻技术解析
电灯转换电路图
全球火电企业将面临长期、非周期性行业变革,市场经营转向智能化
爱立信拿下英国4个大单
中国联通混改最新消息,方案在走最后一道程序并成立大数据物联网等子公司
姨夫自曝索尼十年大招!不放弃手机都为了它
深入浅出解析JVM中的Safepoint
利用3D打印技术,一周可制作十万个口罩绑带
紧凑型市场眼花缭乱,思域与卡罗拉哪个更好?
声卡声音采样
开口式电流互感器在低压配电系统中的应用
中美代表热线聚焦3000亿美元产品关税 美国将推迟对中国部分产品征收关税