WINCE 下 NANDFLASH 文件系统不能写

[问题点数:100分,结帖人:GaryLiu1104]


GaryLiu1104
(Gary Liu)
等 级:
结帖率:100.00%

楼主发表于:2009-12-24 13:52:19

ATMEL at91sam9261,操作系统Wince5.0,256M的三星K9F2G08闪存,系统用了32M,其他是NandFlash文件系统,BSP用的是ATMEL官网公布的BSP。
一般情况下向NandFlash中读写文件都是正常的,但是长时间连续(大约一个多月,每10分钟大约写1M的文件,存储到100多M时会删除部分数据)多次写文件,删除文件重启后,NandFlash就不能写入了,一写入就会死机,读文件还都是正常的,看调试信息,发现逻辑0块被标记为坏块,擦除闪存后可恢复正常,而且逻辑0块可以擦除恢复正常。
各位兄弟有没有遇到类似问题的,出问题的原因可能有哪些呢?麻烦帮忙分析分析。

对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP

回复次数:28


gooogleman
(有问题请到博客留言O(∩_∩))
等 级:

5

5

3

#1楼 得分:10回复于:2009-12-24 13:55:37

没有看到过哦,呵呵。真的不懂。

对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP

精华推荐:2450板子跑400M没有问题,跑533M播放CMMB电视会死机???


rzsheng
(Kevin)
等 级:

#2楼 得分:0回复于:2009-12-24 13:57:26

flash出现坏块了,重新格式化就应该是可以了

对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP

精华推荐:printf 和 RETAILMSG 打印出来的消息不一致?


yashi
(老斩)
等 级:

更多勋章

#3楼 得分:20回复于:2009-12-24 14:03:21

flash的驱动里面最重要是要做块的管理,对于写操作,还要做均衡算法;估计是你的这个驱动算法有问题。

对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP

精华推荐:关于ARM中断处理的问题----《ARM嵌入式系统开发-软件设计与优化》第九章中疑问


xqhrs232
等 级:

#4楼 得分:0回复于:2009-12-24 14:05:53

这个真的是老大难的问题啊!

对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP

精华推荐:WinCE 串口蓝牙


GaryLiu1104
(Gary Liu)
等 级:

#5楼 得分:0回复于:2009-12-24 14:10:38

引用 2 楼 rzsheng 的回复:
flash出现坏块了,重新格式化就应该是可以了

格式化肯定可以恢复正常,使用过程出现坏块是可以正常标记处理的,逻辑0块其实并没有坏,而误标记为坏块的,这样导致整个文件系统就不能再写东西了,一写就死机。

对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP

精华推荐:发帖 关于WINCE下输入法的问题的解决方法


kyzf
(铭记理想,追求卓越)
等 级:

5

#6楼 得分:0回复于:2009-12-24 14:25:53

一般逻辑0块,都是用作特殊功能信息的储存; 
我们也是用Wince6.0,256M的三星K9F2G08,我们的逻辑0块就用来储存ntim 和坏块重分配表。
一般不会逻辑0块 为坏块的。

对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP


liuysheng
(liuysheng)
等 级:

#7楼 得分:0回复于:2009-12-24 14:49:55

LZ应该是破坏了NAND的MBR信息,就是在第0块

对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP


Reallyu
(Show me the mon)
等 级:

#8楼 得分:20回复于:2009-12-24 15:14:22

nandflash 频繁写的话,问题还真是比较多
wince里面,坏块管理和负载均衡的算法都是PB自带,ms提供的,BSP里面只要实现物理读写flash的函数就行了
按道理来说不应该有什么问题
可是我们也碰到过类似LZ的问题.因为我们那个项目的数据量比较小,但是读写频繁,后来就干脆存放在e2prom里面了.
没有去深究这个问题的真正原因.
猜测和异常断电这类的原因有关???
希望有高手来指点下.
而且我一直不太明白,三星的FMD驱动为什么要把每个block的page数强制设置成256
#define PAGES_PER_BLOCK 256 // Phisical 64 * logical 4
这样小页的flash需要用8个block来模拟一个大的block,不是严重影响写nand的性能.
对于大页的flash就没有什么问题
难道这么做就是为了兼容,不过现在小页的flash确实用的越来越少了.

对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP


sailorlyq
等 级:

#9楼 得分:0回复于:2009-12-24 17:48:36

你不是说逻辑0块坏掉了吗?重新擦写当然会重新出现逻辑0块,但这个逻辑0块在物理上可能已经换到别的块去了。

对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP


GaryLiu1104
(Gary Liu)
等 级:

#10楼 得分:0回复于:2009-12-25 09:28:36

引用 8 楼 reallyu 的回复:
nandflash 频繁写的话,问题还真是比较多
wince里面,坏块管理和负载均衡的算法都是PB自带,ms提供的,BSP里面只要实现物理读写flash的函数就行了
按道理来说不应该有什么问题
可是我们也碰到过类似LZ的问题.因为我们那个项目的数据量比较小,但是读写频繁,后来就干脆存放在e2prom里面了.
没有去深究这个问题的真正原因.
猜测和异常断电这类的原因有关???
希望有高手来指点下.
而且我一直不太明白,三星的FMD驱动为什么要把每个block的page数强制设置成256
#define PAGES_PER_BLOCK 256 // Phisical 64 * logical 4
这样小页的flash需要用8个block来模拟一个大的block,不是严重影响写nand的性能.
对于大页的flash就没有什么问题
难道这么做就是为了兼容,不过现在小页的flash确实用的越来越少了.

可能与断电有关系,现在拿了几台在公司模拟测试呢,运行情况比较好的,大半年了也没出问题的。
BSP里面代码是很简单,只是把一些FMD接口实现,所以出问题也不知道从哪里找,实在不行准备直接进行读写了,不用文件系统了,这个问题真的弄的很郁闷。

对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP


pilixuanke
(轩客)
等 级:

#11楼 得分:0回复于:2009-12-25 09:39:55

ce6中不是带了FAL的源代码了吗?把它拿出来,加点调试信息,分析一下,看是在什么时候将0块标记为坏块的。

对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP


pilixuanke
(轩客)
等 级:

#12楼 得分:0回复于:2009-12-25 09:41:31

引用 10 楼 garyliu1104 的回复:
引用 8 楼 reallyu 的回复:
nandflash 频繁写的话,问题还真是比较多
wince里面,坏块管理和负载均衡的算法都是PB自带,ms提供的,BSP里面只要实现物理读写flash的函数就行了
按道理来说不应该有什么问题
可是我们也碰到过类似LZ的问题.因为我们那个项目的数据量比较小,但是读写频繁,后来就干脆存放在e2prom里面了.
没有去深究这个问题的真正原因.
猜测和异常断电这类的原因有关???
希望有高手来指点下.
而且我一直不太明白,三星的FMD驱动为什么要把每个block的page数强制设置成256
#define PAGES_PER_BLOCK 256 // Phisical 64 * logical 4
这样小页的flash需要用8个block来模拟一个大的block,不是严重影响写nand的性能.
对于大页的flash就没有什么问题
难道这么做就是为了兼容,不过现在小页的flash确实用的越来越少了.
可能与断电有关系,现在拿了几台在公司模拟测试呢,运行情况比较好的,大半年了也没出问题的。
BSP里面代码是很简单,只是把一些FMD接口实现,所以出问题也不知道从哪里找,实在不行准备直接进行读写了,不用文件系统了,这个问题真的弄的很郁闷。

这样模拟测试也找不出什么头绪啊。

对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP


GaryLiu1104
(Gary Liu)
等 级:

#13楼 得分:0回复于:2009-12-25 13:39:35

引用 11 楼 pilixuanke 的回复:
ce6中不是带了FAL的源代码了吗?把它拿出来,加点调试信息,分析一下,看是在什么时候将0块标记为坏块的。

用的CE5.0,现在模拟测试主要是看看在哪个环节可能导致问题的产生。

对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP


xuefeng_baggio
(天道酬勤!)
等 级:

#14楼 得分:0回复于:2009-12-25 13:51:39

刚把1g08驱动调好,还没测试,这个问题是不是和系统文件系统有关系呢?关注中..

对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP


guopeixin
(懒羊羊)
等 级:

#15楼 得分:30回复于:2009-12-25 17:22:28

引用 13 楼 garyliu1104 的回复:
引用 11 楼 pilixuanke 的回复:
ce6中不是带了FAL的源代码了吗?把它拿出来,加点调试信息,分析一下,看是在什么时候将0块标记为坏块的。
用的CE5.0,现在模拟测试主要是看看在哪个环节可能导致问题的产生。

1. 你测试出来问题的机台测试方法是:十分钟写1MB&测试一个多月&中间频繁重启
  没有问题的机台方法是:大半年了也没出问题
从这点上看测试方法并不一样呀,没啥可比性呀
2. 建议去掉机器重启的动作,以避免电压电流波动对flash ic的影响,重新挂机,不过时间比较长哦
这个测试的目的是验证是否是电压电流波动对数据产生的影响

对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP


guopeixin
(懒羊羊)
等 级:

#16楼 得分:0回复于:2009-12-25 17:23:10

引用 15 楼 guopeixin 的回复:
引用 13 楼 garyliu1104 的回复:
引用 11 楼 pilixuanke 的回复:
ce6中不是带了FAL的源代码了吗?把它拿出来,加点调试信息,分析一下,看是在什么时候将0块标记为坏块的。
用的CE5.0,现在模拟测试主要是看看在哪个环节可能导致问题的产生。
1. 你测试出来问题的机台测试方法是:十分钟写1MB&测试一个多月&中间频繁重启
            没有问题的机台方法是:大半年了也没出问题
从这点上看测试方法并不一样呀,没啥可比性呀
2. 建议去掉机器重启的动作,以避免电压电流波动对flash ic的影响,重新挂机,不过时间比较长哦
这个测试的目的是验证是否是电压电流波动对数据产生的影响

以前十分钟写1M,一个月出现问题,现在你就不停的写,不停地删除,浮现问题应该比较快

对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP


gsymichael
(哥解的不是Bug,是寂寞!)
等 级:

#17楼 得分:10回复于:2009-12-25 22:04:31

引用 16 楼 guopeixin 的回复:
引用 15 楼 guopeixin 的回复:
引用 13 楼 garyliu1104 的回复:
引用 11 楼 pilixuanke 的回复:
ce6中不是带了FAL的源代码了吗?把它拿出来,加点调试信息,分析一下,看是在什么时候将0块标记为坏块的。
用的CE5.0,现在模拟测试主要是看看在哪个环节可能导致问题的产生。
1. 你测试出来问题的机台测试方法是:十分钟写1MB&测试一个多月&中间频繁重启
            没有问题的机台方法是:大半年了也没出问题
从这点上看测试方法并不一样呀,没啥可比性呀
2. 建议去掉机器重启的动作,以避免电压电流波动对flash ic的影响,重新挂机,不过时间比较长哦
这个测试的目的是验证是否是电压电流波动对数据产生的影响
以前十分钟写1M,一个月出现问题,现在你就不停的写,不停地删除,浮现问题应该比较快

顶。Flash问题就得不断测试。

对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP


gooogleman
(有问题请到博客留言O(∩_∩))
等 级:

5

5

3

#18楼 得分:0回复于:2009-12-26 08:36:19

考验功夫的时候来了!

对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP


GaryLiu1104
(Gary Liu)
等 级:

#19楼 得分:0回复于:2009-12-26 19:14:45

引用 16 楼 guopeixin 的回复:
引用 15 楼 guopeixin 的回复:
引用 13 楼 garyliu1104 的回复:
引用 11 楼 pilixuanke 的回复:
ce6中不是带了FAL的源代码了吗?把它拿出来,加点调试信息,分析一下,看是在什么时候将0块标记为坏块的。
用的CE5.0,现在模拟测试主要是看看在哪个环节可能导致问题的产生。
1. 你测试出来问题的机台测试方法是:十分钟写1MB&测试一个多月&中间频繁重启
            没有问题的机台方法是:大半年了也没出问题
从这点上看测试方法并不一样呀,没啥可比性呀
2. 建议去掉机器重启的动作,以避免电压电流波动对flash ic的影响,重新挂机,不过时间比较长哦
这个测试的目的是验证是否是电压电流波动对数据产生的影响
以前十分钟写1M,一个月出现问题,现在你就不停的写,不停地删除,浮现问题应该比较快

通过几天的测试:问题可以重现,Flash频繁写擦,1分钟1M,且多次调用文件读写函数,用5台测试一周,有两台出现问题,闪存一写就死机,看启动信息这两台均出现坏块,但是擦除后闪存重新整理就没有坏块了,说明是假坏块。不知道有没有朋友做过类似的测试,是不是CE5这么用闪存就可能会出现问题呢?现在打算改程序,减少闪存的使用,原因继续查找中。。有进展的话再和大家分享。

对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP


joyzml
(朱铭雷)
等 级:

#20楼 得分:0回复于:2009-12-27 13:57:08

此贴应该加精
深度讨论
嘎嘎
——————————————————————————
JOYZML(菜鸟朱铭雷)

对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP


GaryLiu1104
(Gary Liu)
等 级:

#21楼 得分:0回复于:2009-12-28 17:33:54

今天在闪存FMD函数中加入调试信息发现,写或者改闪存中文件的文件名时,系统其实没死,只是一直在进行下面的操作,只不过界面上鼠标没响应,看着"假死"了。
->FMD_GetBlockStatus //进入FMD_GetBlockStatus函数
->FRS=18100 //FMD_ReadSector函数读取0x18100
<-FRZ = 2 //读spare区
<-FMD_GetBlockStatus//FMD_GetBlockStatus函数执行结束
->FRS=18100//FMD_ReadSector函数读取0x18100
<-FRZ = 2//读spare区
->FRS=18100//FMD_ReadSector函数读取0x18100
<-FRZ = 1//读data区
->FMD_GetBlockStatus
->FRS=FB40
<-FRZ = 2
<-FMD_GetBlockStatus
->FRS=FB40
<-FRZ = 2
->FRS=FB40
<-FRZ = 1
->FMD_GetBlockStatus
->FRS=18100
<-FRZ = 2
<-FMD_GetBlockStatus
->FRS=18100
<-FRZ = 2
->FRS=18100
<-FRZ = 1
->FMD_GetBlockStatus
->FRS=FB40
<-FRZ = 2
<-FMD_GetBlockStatus
->FRS=FB40
<-FRZ = 2
->FRS=FB40
<-FRZ = 1
....一直循环运行
一直在Get 0xFB40和0x18100的状态,和读两个扇区中的数据。
我把两个扇区的内容读出来比较发现,内容基本相同,但是有几个字节的一位不对,比如一个是0xE0一个为0xA0。
我想是不是系统是要把一个扇区的内容写到另一个扇区(有个扇区为数据备份扇区),但是操作总是不成功,所以就一直循环操作。
但是没出问题前或恢复一下怎么写文件,改文件名等都是正常的。系统写文件到闪存时,不成功为什么不直接返回失败,而一直在死循环里面走的,有点不明白,望高手指教。

对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP


guopeixin
(懒羊羊)
等 级:

#22楼 得分:0回复于:2009-12-28 19:24:05

引用 21 楼 garyliu1104 的回复:
今天在闪存FMD函数中加入调试信息发现,写或者改闪存中文件的文件名时,系统其实没死,只是一直在进行下面的操作,只不过界面上鼠标没响应,看着"假死"了。
->FMD_GetBlockStatus //进入FMD_GetBlockStatus函数
->FRS=18100 //FMD_ReadSector函数读取0x18100
<-FRZ = 2 //读spare区
<-FMD_GetBlockStatus//FMD_GetBlockStatus函数执行结束
->FRS=18100//FMD_ReadSector函数读取0x18100
<-FRZ = 2//读spare区
->FRS=18100//FMD_ReadSector函数读取0x18100
<-FRZ = 1//读data区
->FMD_GetBlockStatus
->FRS=FB40
<-FRZ = 2
<-FMD_GetBlockStatus
->FRS=FB40
<-FRZ = 2
->FRS=FB40
<-FRZ = 1
->FMD_GetBlockStatus
->FRS=18100
<-FRZ = 2
<-FMD_GetBlockStatus
->FRS=18100
<-FRZ = 2
->FRS=18100
<-FRZ = 1
->FMD_GetBlockStatus
->FRS=FB40
<-FRZ = 2
<-FMD_GetBlockStatus
->FRS=FB40
<-FRZ = 2
->FRS=FB40
<-FRZ = 1
....一直循环运行
一直在Get 0xFB40和0x18100的状态,和读两个扇区中的数据。
我把两个扇区的内容读出来比较发现,内容基本相同,但是有几个字节的一位不对,比如一个是0xE0一个为0xA0。
我想是不是系统是要把一个扇区的内容写到另一个扇区(有个扇区为数据备份扇区),但是操作总是不成功,所以就一直循环操作。
但是没出问题前或恢复一下怎么写文件,改文件名等都是正常的。系统写文件到闪存时,不成功为什么不直接返回失败,而一直在死循环里面走的,有点不明白,望高手指教。

lz确实是蛮有细心和耐心的,距离问题的解决不远了
fal里面是有一些类似的bug,你看一下你的读写失败的情况下是否返回了错误的值

对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP


seth1104
(liugang)
等 级:

#23楼 得分:10回复于:2009-12-29 21:36:04

快沉了,帮顶!

对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP


yulewjx
等 级:

#24楼 得分:0回复于:2009-12-29 22:01:27

帮楼主顶。

对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP


gowyz
(gowyz)
等 级:

#25楼 得分:0回复于:2009-12-30 16:22:59

低级格式化

对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP


houwenjie_0
等 级:

#26楼 得分:0回复于:2009-12-31 12:50:21

我用的是NOR Flash,写几次就会报disk full,搞不清楚怎么回事儿!

对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP


GaryLiu1104
(Gary Liu)
等 级:

#27楼 得分:0回复于:2010-01-07 08:15:03

下午结贴,最终决定数据缓存不用文件系统了,只保留了32M的fat系统用来存储配置文件,一般是只读的。其他的闪存区域自己来管理存储数据。

对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP


zwtchy123
(zwtchy123)
等 级:

#28楼 得分:0回复于:2010-01-07 08:35:13

uping

posted on 2010-05-31 09:48  xilentz  阅读(1450)  评论(0编辑  收藏  举报