发新帖我要提问
12
返回列表
打印

在21IC DIY U盘实验板上实现的128MB U盘(含坏块管理)

[复制链接]
楼主: computer00
手机看帖
扫描二维码
随时随地手机跟帖
21
computer00|  楼主 | 2009-3-31 00:46 | 只看该作者 回帖奖励 |倒序浏览

要那么大内存做啥呢?俺有128M的FLASH~~~~查个表就行了。

这个写均衡不用做吧,windows会自动帮你搞的吧。倒是让俺担心的是FAT区比较容易挂得快。
挂了就启用备用区了,我想应该够用了。交换区是有做均衡处理的。

使用特权

评论回复
22
alex74| | 2009-3-31 08:39 | 只看该作者

...

你理解错了.
写均衡要你做的.windows写过来是固定的逻辑扇区, 比如bpb就是写到0
正如你担心的,fat表会重复写, 特别需要写均衡.

使用特权

评论回复
23
xwj| | 2009-3-31 09:28 | 只看该作者

是的,蛋蛋的理解有问题

FAT文件系统对目录区和索引区的损耗实在是太大了,因为任何一个文件的改写都要重新擦写一次目录,所以不做成动态映射的写平衡的话 再多的次数都会很快耗尽的。

而FAT的目录区和索引区很明显是放在固定的逻辑扇区上的。
写平衡只能烤你自己在底层实现哦

使用特权

评论回复
24
computer00|  楼主 | 2009-3-31 09:59 | 只看该作者

那如果要全部都动态轮流用的话,速度可能会大大下降哦…

而且系统开销也会上去。而且俺非常担心这个影射关系被弄丢了……每次写操作都要去更新一下这个影射关系啊,
又需要动态调整保存这个影射关系的地方了,那如果保存这个影射关系的地方不固定,我怎么找到它并加载?
如果固定了,那它又经常被改写,也容易坏……

所以干脆俺就偷懒算了,直接保留了50个块,就算你那些拼命用吧,用坏了没关系,
还有备用的。每个块的使用寿命没那么低吧?俺这个又不是搞什么军用产品,所以
就这么将就着用吧。等到这些备用的块都全部用完时,估计也到了猴年马月了吧。

使用特权

评论回复
25
xwj| | 2009-3-31 10:22 | 只看该作者

总共就1024块,每块附加记录索引号和次数即可,搜索也很快

还要更快的话,就在初始化时做索引区内存镜像即可。

由于实际上是块擦除影响寿命,所以只要做到1024块的平衡写即可。


而坏块记录、判断等,也应该由附加区的标志和数据规律来判断。

使用特权

评论回复
26
古道热肠| | 2009-3-31 10:40 | 只看该作者

哈哈,写平衡的确较复杂,估计消费类电子产品大都不弄这一块

NandFlash读次数是没有限制的,写有寿命限制,特别适合于数据交换次数不多的应用,比如U盘和MP3,MP4等.作硬盘类应用本身就不太合适.这一点目前用NandFlash做电子硬盘的大公司都头疼,性能不尽人意.

使用特权

评论回复
27
computer00|  楼主 | 2009-3-31 10:46 | 只看该作者

回复老X,那附加数据本身呢?位置固定?那还不是跟原来一

每写一次,就要更新附加数据,结果其它地方没坏,附加数据挂了,有啥意义?

使用特权

评论回复
28
xwj| | 2009-3-31 11:11 | 只看该作者

附加数据就是每块多出来的4k字节啊,存在自己这一块里的啊

咋就这么不开窍呢???

使用特权

评论回复
29
computer00|  楼主 | 2009-3-31 11:28 | 只看该作者

这样子啊……那每次影射时,都要去查一个1024大小的表格,

使用二分查表法,最多10次,这个可以接受。

每次写时,需要先去搜索使用次数最小的,这个可以直接取出来,然后重新排序,这个最坏情况的交换就有点多了。
如果直接去查表,又太多了。

就是表格有点大啊……影射关系一张表,需要4KB(不考虑扩展性吧,就一个块地址占2字节),
另外使用次数还需要一张表,又是4KB。

这样搞倒是可以省掉了交换区,直接把数据复制到新块并重新写入……

算了,俺还是不想这个了,搞一下又要费俺不少时间啊……先将就着用吧~~~~

使用特权

评论回复
30
computer00|  楼主 | 2009-3-31 11:31 | 只看该作者

突然发现不对,这样完整影射时,就不用查表了……直接读

使用特权

评论回复
31
xwj| | 2009-3-31 12:28 | 只看该作者

呵呵,做了内存映射的话内存表格就直接放物理块地址了

只须初始化一次,以后读写时只要一次查表即可。

改写时不需要反复倒数据的,当然会快很多。
至于4kB的内存,对于ARM来说也不算什么。

而块平衡就好做的很了,看下当前块的擦写次数,如果比擦写次数最少的那个块大1000(或更多),则交换它们的映射位置即可。
又快又方便哦:-)


PS:
一个块地址占2字节是对的,象三星手册里,一片的最大容量是8GB,刚好16bit。

当然,现在的FLASH单片容量真是吓人,SSD都做到1TB了,所用的芯片 单片容量那就更大了...

使用特权

评论回复
32
computer00|  楼主 | 2009-3-31 12:53 | 只看该作者

嘿嘿,老X,不如这个任务就交给你吧……

使用特权

评论回复
33
xwj| | 2009-3-31 14:09 | 只看该作者

呵呵,我倒是想啊,可是老x现在太忙了,没时间啊~~

而且,蛋蛋,你的程序咋都是用的CARM的编译器呢? 老x硬是没找到3.03之前的Keil版本啊...

使用特权

评论回复
34
alex74| | 2009-3-31 14:23 | 只看该作者

....

写均衡是最麻烦的.好几年了我都在观察和思考这个问题.看有没有完美的解决办法,看了很多实现方法, 总觉得不完美, 太麻烦.

使用特权

评论回复
35
computer00|  楼主 | 2009-3-31 15:47 | 只看该作者

你可以自己创建一个新的工程,然后覆盖掉启动文件,

再把源代码添加进去编译呀……如果找不到MCU头文件的话,圈圈可以把头文件放来呀……
这个代码全部是标准的C写的,出了启动文件和MCU的头文件不一样之外,其它的应该都一样的。
也没有用过特殊关键字申明中断服务函数什么的,完全是一个查询的……

回34楼alex74,所以俺干脆直接偷懒不平衡算了,这个写的次数也不太多,还有50个块备用,
就让它坏吧,省事又省心,复杂度低了,还减少了出错的可能性。而且耗资源也少。

使用特权

评论回复
36
古道热肠| | 2009-3-31 17:34 | 只看该作者

用MDK自带的例程中的启动文件替代圈圈的项目启动文件,能编

注意项目选项卡要选中RealView编译器.

使用特权

评论回复
37
mindshare| | 2009-4-1 12:19 | 只看该作者

00确实不错地说,可以试着改进一下块管理方式

现在市面上大容量的nandflash 都是MLC 的,而MLC相对于SLC的nandflash 而言寿命更短更容易出坏块,所以,现在产品级的nandflash 驱动都是 好块管理方式,以达到 写平均.

使用特权

评论回复
38
wangkj| | 2009-4-1 13:10 | 只看该作者

C51系统上实现YAFFS文件系统

http://bbs.**/thread-37992-1-80.html
相关链接:http://bbs.**/thread-37992-1-80.html

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则