共8条
1/1 1 跳转至页
大神们,谁有TFFS的资料呢?
TFFS,True Flash File System的简写,在Vxworks中,在系统flash设备上构造的一个基于DOS的文件系统,用于存放交换及应用程序,BootROM程序等很少需要修改的信息,便于程序的更新和升级。
Tornado的TFFS是和VxWorks兼容的一种M-Systems Flite实现方式,版本为2.0。它为种类繁多的flash存储设备提供了统一的块设备接口,并且具有可重入、线程安全的特点,支持大多数流行的CPU构架。有了Tornado的TFFS,应用程序对flash存储设备的读写就好象它们对拥有MS-DOS文件系统的磁碟设备的操作一样。
TFFS由核心层(core layer)和三个功能层,翻译层(translation layer),MTD层(MTD layer),socket层(socket layer)组成。
核心层(Core layer):核心层主要起相互连接其他几层的功能。同时它也可以进行碎片回收、定时器和其他系统资源的维护。通常WindRiver公司将这部分内容以二进制文件提供。
翻译层主要实现TFFS和dosFs之间的高级交互功能。它也包含了控制flash映射到块、wear-leveling、碎片回收和数据完整性所需的智能化处理功能。目前有三种不同的翻译层模块可供选择。选择哪一种层要看你所用的flash介质是采用NOR-based, 还是NAND-based, 或者SSFDC-based技术而定。
Socket层则是提供TFFS和板卡硬件(如flash卡)的接口服务。其名字来源于用户可以插入flash卡的物理插槽。用来向系统注册socket设备,检测设备拔插,硬件写保护等。后面将详细讲解它的功能。
MTD层(Memory Technology Drivers)功能主要是实现对具体的flash进行读、写、擦、ID识别等驱动,并设置与flash密切相关的一些参数。TrueFFS已经包含了支持Intel,AMD以及samsung部分flash芯片的MTD层驱动。新的芯片需要新的MTD支持,你可以使用一个标准的接口来加入这些驱动。
以上四部分,我们通常要的工作就是后两层。
当在VxWorks下配置TrueFFS时,你必须为每一层至少包含一个软件模块。
我用的FLASH型号是一个AMD兼容的NOR FLASH, 2M的,划入TFFS的是高1.5M,也就是FORMAT参数为:
tffsDevFormatParams myDefaultParams =
{
{
0x80000L,
99,
1,
0x10000l,
NULL,
{0,0,0,0},
NULL,
2,
0,
NULL
},
FTL_FORMAT
};
MTD实际上我只挂了三个函数:
MAP,WRITE,ERASE
MAP就是计算地址了,WRITE的时候当参数REWRITE==1的时候先读出64k到BUFFER然后改写最后从新写回,如果不是rewrite就直接编程。
结果跑起来以后发现速度实在是慢的可以,下一个512K不到的文件,写到FLASH里需要将近30秒,自己在WRITE/ERASE的MTD函数中打印发现经常就些没几个BYTE但是整个一块64K的FLASH也要从写这样,速度超慢。remove一个文件也是如此。
我这还是修改过DOSFS里的sector_bit呢,原来dosfs的每个sector=512的时候下一个512K的东西反正10分钟我看还没有结束的迹象,SECTOR数目到300多了。。。。。。
我现在修改的sector大小为0x2000,也就是sector bit 13,还是感觉很慢。想问一下各位使用TFFS的状况。还有文件系统操作里比较耗时的还有哪些地方呢?
目前的速度是下一个472K的文件写到文件系统中需要大约37秒。
最后附上,当打开TFFS DEBUG和我自己的FLASHWRITE ERASE DEBUG 后的打印消息和部分代码
#define FTP_ADDR "192.168.1.181"
#define FILE_NAME "little.z"
#define USER_NAME "uboot"
#define PASS_WORD "uboot"
#define IMAGE_NAME "image.z"
void flashTest()
{
/*.......
变量声明啥的略
登陆FTP打开文件,DATAsocke为 DATA_SOCK
........这段没啥关系就略了
*/
sprintf(fullname,"%s/%s",MY_TFFS_NAME,IMAGE_NAME);
fd= creat(fullname,O_RDWR);
/*创建文件~~之前做过format或者remove*/
if(ERROR==fd)
{
printf("tffs create file error, exit\n");
return;
}
totalLen=0;
bufferLen=64*1024;
bufferleft=bufferLen;
readLen=0;
offset=0;
while(1)
{
do
{
readLen=read(DATA_SOCK,tempbuf+offset,bufferleft);
totalLen+=readLen;
offset+=readLen;
bufferleft-=readLen;
}while((0!=bufferleft)&&(0!=readLen)&&(ERROR!=readLen));
printf("now read 0x%x\n",offset);
written=write(fd,tempbuf,offset);
if(written!=offset)
{
printf("write error, 0x%x should write to tffs but in fact 0x%x written\n",offset,written);
goto error_out;
}
else
{
printf("write 0x%x bytes to tffs\n",written);
}
bufferleft=bufferLen;
offset=0;
if(0==readLen)
{
break;
}
}
printf("ftp read totalLen= 0x%x\n",totalLen);
error_out:
/*
登出FTP,FREE掉BUFFER也略了~
*/
}
tffsDevFormatParams myDefaultParams =
{
{
0x80000L,
99,
1,
0x10000l,
NULL,
{0,0,0,0},
NULL,
2,
0,
NULL
},
FTL_FORMAT
};
MTD实际上我只挂了三个函数:
MAP,WRITE,ERASE
MAP就是计算地址了,WRITE的时候当参数REWRITE==1的时候先读出64k到BUFFER然后改写最后从新写回,如果不是rewrite就直接编程。
结果跑起来以后发现速度实在是慢的可以,下一个512K不到的文件,写到FLASH里需要将近30秒,自己在WRITE/ERASE的MTD函数中打印发现经常就些没几个BYTE但是整个一块64K的FLASH也要从写这样,速度超慢。remove一个文件也是如此。
我这还是修改过DOSFS里的sector_bit呢,原来dosfs的每个sector=512的时候下一个512K的东西反正10分钟我看还没有结束的迹象,SECTOR数目到300多了。。。。。。
我现在修改的sector大小为0x2000,也就是sector bit 13,还是感觉很慢。想问一下各位使用TFFS的状况。还有文件系统操作里比较耗时的还有哪些地方呢?
目前的速度是下一个472K的文件写到文件系统中需要大约37秒。
最后附上,当打开TFFS DEBUG和我自己的FLASHWRITE ERASE DEBUG 后的打印消息和部分代码
#define FTP_ADDR "192.168.1.181"
#define FILE_NAME "little.z"
#define USER_NAME "uboot"
#define PASS_WORD "uboot"
#define IMAGE_NAME "image.z"
void flashTest()
{
/*.......
变量声明啥的略
登陆FTP打开文件,DATAsocke为 DATA_SOCK
........这段没啥关系就略了
*/
sprintf(fullname,"%s/%s",MY_TFFS_NAME,IMAGE_NAME);
fd= creat(fullname,O_RDWR);
/*创建文件~~之前做过format或者remove*/
if(ERROR==fd)
{
printf("tffs create file error, exit\n");
return;
}
totalLen=0;
bufferLen=64*1024;
bufferleft=bufferLen;
readLen=0;
offset=0;
while(1)
{
do
{
readLen=read(DATA_SOCK,tempbuf+offset,bufferleft);
totalLen+=readLen;
offset+=readLen;
bufferleft-=readLen;
}while((0!=bufferleft)&&(0!=readLen)&&(ERROR!=readLen));
printf("now read 0x%x\n",offset);
written=write(fd,tempbuf,offset);
if(written!=offset)
{
printf("write error, 0x%x should write to tffs but in fact 0x%x written\n",offset,written);
goto error_out;
}
else
{
printf("write 0x%x bytes to tffs\n",written);
}
bufferleft=bufferLen;
offset=0;
if(0==readLen)
{
break;
}
}
printf("ftp read totalLen= 0x%x\n",totalLen);
error_out:
/*
登出FTP,FREE掉BUFFER也略了~
*/
}
8楼
我想问问就是判断UnitHeader的合法性有啥用呢(就是比对那两个数组),及时头部不合法,似乎也不影响什么吧?
共8条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 | |
【分享评测,赢取加热台】使用8051单片机驱动WS2812被打赏40分 |