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