6167|14

80

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

使用2K大页NANDFLASH驱动出现丢失链簇问题,请教有没有人碰到过? [复制链接]

硬件是2440+K9F4G08U0A,512MBflash,WINCE5.0,BSP为4.2升级的那种。
使用zhenshijie同志的2K大页NANDFLASH驱动,加载、显示、存取都很正常。

但是使用一段时间后发现,如果存了很多数据,例如已经使用了490MB之后,
再拷贝一个大于剩余空间的文件进入的话,在提示空间不足后,NANDFLASH就不正常了。
表现为:
1、无法删除NANDFLASH上的已存在文件了,提示空间不足。
2、查看属性应该还剩下10M左右空间,但是无法再存放小于剩余空间的文件了,就算
新建一个文件夹也是不成功。
3、使用控制面板中的存取管理器,卸载NANDFLASH盘后,扫描提示出现1个丢失的链簇。
4、由于我的注册表使用HIVE,在重启开机后,FMD启动MOUNT出现错误,系统无法启动了。

我发现一些不能理解的地方应该有点关系:
1、除了第一次格式化,用到FMD_EraseBlock1G08()函数外,在拷贝数据,擦除数据都没有使用到这个函数了。
我再这个函数中加上了串口打印信息,没有看到出现。是否在FMD_WriteSector1G08()中已经有擦除动作?
2、我看了NAND.S中的WrPage2048函数应该是没有擦除动作的,那么是否表示NANDFLASH没有把已经用过的块
擦除重新利用?如果是这样就可以反面说明,上面的现象了,当一个大于剩余空间的文件被写入时,只有写到最后
无空间时,才提示空间不足,但是前面部分文件数据已经把剩余的NANDFLASH块写过了,自然后面新建文件夹、拷贝
小文件都无法成功了,因为没有全新的0XFF的块了,而WINCE不知道为甚么没有去回收一些使用过的块,而导致空间
不足了。

请使用过的同志谈谈看法,如果有硬件条件的不妨测试测试写满后的表现,然后告诉我。或者有已经解决的大虾不惜赐教啊!

万分感谢,渴望交流。

最新回复

问题已经解决,结贴: 1、不要把所有块都格式化为FAT的分区,保留几块在最后不用。例如:我的FLASH为4096个块,那么不要设置 pFlashInfo->dwNumBlocks        = NUM_BLOCKS;//0x1000; 而要设置为: pFlashInfo->dwNumBlocks        = NUM_BLOCKS-10;//10只是测试用,可以小到多少可以试,建议留出2块以上。 有些驱动写为: pFlashInfo->dwNumBlocks                        = NUM_BLOCKS - IMAGE_START_BLOCK; 其实我测试了,好像少了比较多的空间。不知这值具体含义是什么。 我猜测是NANDFLASH的总块数,包含了前面的BOOT和NK的块数了。 但是在FMD_GetBlockStatus时,必须把BOOT和NK的块返回BAD。 2、FMD驱动中对硬件有操作的函数都必须加上,信号量控制,防止不同线程争用出错。 回收线程是在空闲和硬件空间不足时启动的,很有可能与读写操作冲突,这是我的猜测,知道的人说说看。 3、另外,有个老外的网站说不妨吧回收线程的优先级提高,也可以解决这个问题。不过我没有提高也解决了。   详情 回复 发表于 2008-11-19 20:10
点赞 关注

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
如果我的直觉没错的话
1、无法删除NANDFLASH上的已存在文件了,提示空间不足。 这个最可疑,删除怎么走到提示空间不足的地方?查一下函数调用吧.
2.没看太明白.不好意思.
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
1、删除功能应该是FAT文件系统上层实现的,转化到FMD的函数调用是哪几个?FMD的流程还不是很明白。
2、现象2的意思是剩下的NANDFLASH空间无法使用了。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

4
 
在wince4。2中fat系统是以512byte为一个sector来处理的。现在要用2k的flash,除了改flash驱动,fat也要改啊。不过不能直接改成2k哦。改下存取函数。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 3 楼 anngy 的回复:
在wince4。2中fat系统是以512byte为一个sector来处理的。现在要用2k的flash,除了改flash驱动,fat也要改啊。不过不能直接改成2k哦。改下存取函数。


BSP是 4.2的,但是升级放在wince5.0中。我觉得还是flash驱动的问题。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

6
 
嗯,那看楼主是不是调用的wince5.0中的fal.lib了。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(中级)

7
 
引用 5 楼 anngy 的回复:
嗯,那看楼主是不是调用的wince5.0中的fal.lib了。


肯定调用了。这个fal在wince5.0是不开源的,在6.0下开源了。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

8
 
不见得吧。说不好楼主直接把以前4。2上的文件拖到5。0下面用了呢。看来gooleman是上wince5。0时直接用了fal.lib了。偶们早期就没用过。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 7 楼 anngy 的回复:
不见得吧。说不好楼主直接把以前4。2上的文件拖到5。0下面用了呢。看来gooleman是上wince5。0时直接用了fal.lib了。偶们早期就没用过。


我看过那份代码,的确链接了 fal.lib
wince只有两种架构吧一种 FAL+FMD
                  一种 MDD+PDD(听说6.0下用)
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 3 楼 anngy 的回复:
在wince4。2中fat系统是以512byte为一个sector来处理的。现在要用2k的flash,除了改flash驱动,fat也要改啊。不过不能直接改成2k哦。改下存取函数。

改FAT的Boot Sector就可以使用2K的Sector了。改一下Format部分就行了。
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

11
 
楼上应该是高人。问一下FAT的这两个地方是在PUBLIC里面的吗?还是FMD的?不是很了解PUBLIC里面的东西,请再详细说说。谢谢!

我是使用4.2的整个BSP的驱动,但是FAL等肯定是使用5.0系统的。
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

12
 
已经能够识别到2k的扇区大小了,应该说明FAL已经支持了吧?
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

13
 
查了一下,一个外文网站上的描述很像,但是他们给出的方法不起效。
我设置Paging 为 0时无法启动,停在FMD格式化之后了。
好像是无法AUTOMOUNT。

d.shukla" a ecrit dans le message de
news: 5E3FCA91-46AE-40F7-90F1-3D563C9FFC21@xxxxxxxxxxxxxxxx

Hi
I have a strata flash present on my pxa270 board for which I am using
mainstoneII bsp. Everything works fine with the driver, but I am having
one
trouble. Once the strata flash gets full, win ce doesn't let me
delete/replace files anymore. It says not enough free space available,
delete
some files to make free space but it doesn't let me delete the file. I
have
to format the disk if it gets full but it deletes all the other files
also.
I tries to use RAMDisk just to check if I face the same thing over there.
But there after making it full, I am able to delete the files.
Another thing, once the flash gets full, I start getting compactor
messages
but the file system doesn't even get into my driver.
Following are the messages I get over the serial port:

0x83d34400: FLASHDRV.DLL:CP_StartCompactor() - There aren't any DIRTY
sectors left; the compactor can't be started
0x83d34400: FLASHDRV.DLL:SM_GetNextFreeSector() - Unable to start
compactor
in critical situation!!!
0x83d34400: FLASHDRV.DLL:SM_GetNextFreeSector() - Unable to reclaim any
free
sectors in a critical compaction stage. Media must be full.
0x83d34400: FLASHDRV.DLL:WriteToMedia() - Unable to get next free physical
sector address for writing! The media is full...
0x83d34400: FLASHDRV.DLL:WriteToMedia() failed.
0x83d34400: Read/Write Sector failed (112) on Sector 7

I have inserted serial messages in driver all over but I am not getting
any
of them.
Please suggest what to do?
--
GD Shukla


Try to disable paging for your flash profile
in registry. I know, that looks strange, but
100% sure paging afects compactor's
behaviour.

[HKLM\System\StorageManager\Profiles\YourFlashProfile]
"Paging"=dword:0


It is interesting!
Since setting the "Paging" to zero will supress the xxx_ReadFileWithSeek FSD
functions, dose that mean ReadFileWithSeek might affect the the behavior of
FAL's compactor thread??

paging will lock files and thus sectors so they cannot be moved around by
the compactor and thus further reducing the amount of room the FAL has to
wear level things into.

--
Steve Maillet
EmbeddedFusion
www.EmbeddedFusion.com
smaillet at EmbeddedFusion dot com
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

14
 
继续求教。

测试了一下,写扇区的函数中,使用地址是一直上升直到0XFFF(4096 BLOCK)就报错了。
也就是到了FLASH的最大块,没有空间就出现写文件错误。
一直没有见到文件系统进行回收脏扇区(已删除数据文件的使用过的扇区)的动作。
这样,nandflash属性中有空间,但是无法再写数据了。
删除操作也不行。

 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

15
 
问题已经解决,结贴:

1、不要把所有块都格式化为FAT的分区,保留几块在最后不用。例如:我的FLASH为4096个块,那么不要设置
pFlashInfo->dwNumBlocks        = NUM_BLOCKS;//0x1000;
而要设置为:
pFlashInfo->dwNumBlocks        = NUM_BLOCKS-10;//10只是测试用,可以小到多少可以试,建议留出2块以上。

有些驱动写为:
pFlashInfo->dwNumBlocks                        = NUM_BLOCKS - IMAGE_START_BLOCK;
其实我测试了,好像少了比较多的空间。不知这值具体含义是什么。
我猜测是NANDFLASH的总块数,包含了前面的BOOT和NK的块数了。
但是在FMD_GetBlockStatus时,必须把BOOT和NK的块返回BAD。

2、FMD驱动中对硬件有操作的函数都必须加上,信号量控制,防止不同线程争用出错。
回收线程是在空闲和硬件空间不足时启动的,很有可能与读写操作冲突,这是我的猜测,知道的人说说看。

3、另外,有个老外的网站说不妨吧回收线程的优先级提高,也可以解决这个问题。不过我没有提高也解决了。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表