最近准备用LPC2292+NAND FLASH作项目应用,在学习ZLG的FFS时,对于DISK_INIT()函数有几个疑问(原文参考:《ARM嵌入式系统软件开发实例(二)》): 1、对于代码第64行for循环的疑问: 原代码如下: ...... j= Index->BlockSum; ---------(62) ........ for(i = 1;i < j; i++) --------------(64) { if(i%(BytsPerSec * 8)) == 0) { k++; Drive->ExSectorRead(Drive->Index,bufa,k); --------------(66) } if((bufa[(i/8) * bytsPerSec] & (1 << (i % 8)))!= 0) { ....... } } ........ 在第62行:j = Index->BlockSum;j被赋予有效块总数值,而一般是有效块数小于或等于总的块数, 在代码中,对于遇到无效块时,并没有特殊处理,i 照样+1,我的理解是:会使for循环检索的范围减 小而漏失有效块。故这里还是应该改为所有块的总数(包括有效无效块), 2、上面的代码66行:本来是想在读取出来坏块表处理完后,再读取下一部分,由NNFormatA函数来看, 坏块表是保存在扇区的主数据区域的,但这里却读取其备用数据区域。显然位置不对。同样的错误在42行也一样。 3、针对这个for循环所实现的功能,我只假设一种情形来验证其操作正确性: 假设,现有一个物理块索引为 i 的块,其操作状态为USR_BLOCK(内部各扇区处于使用状态),即已经使用状态, 其映射的逻辑块地址为: Lsn(0 < Lsn < j); 这种假设应该说是最正常不过了,其实就是一个空间被写满, 具有正常映射关系的块。 按照程序流程执行一遍,却被代码113行给咔嚓掉了。哈哈, 4、在第99行,如果此时的 VBlockInfo[temp] = i, 情况会是什么样呢?同样的;咔嚓! 上面的只是我个人的理解,不一定理解的透彻,故不一定对。ZLG能够给与指点迷津,自是感谢。但如果不予指点, 则只希望与我一样的对此感兴趣的鸟儿来共同探讨。 |