打印
[ZLG-ARM]

ZLG-FFS的疑问:

[复制链接]
1186|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sjpu|  楼主 | 2008-6-6 15:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近准备用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能够给与指点迷津,自是感谢。但如果不予指点,
    则只希望与我一样的对此感兴趣的鸟儿来共同探讨。
    

相关帖子

沙发
sjpu|  楼主 | 2008-6-7 20:06 | 只看该作者

ZLG-FFS的疑问:

5、 FFSFreeSector()函数中
......
if(Drive != NULL)
if(VBlockIndex < Index ->BlockSum)            ---(6)
{
  BlockIndex = Index->VBlockInfo[VBlockIndex];  ---(7) //获得块物理索引
  if(BlockIndex < Index->BlockSum)              ---(8) 
  if(BlockIndex != 0)
   ...........
   
}
..........

在NAND FLASH中,有效块的总数永远是小于或等于所有块的总数。但一个有效块的
块索引在数字的值上有可能小于、等于或者大于有效块的总数的数值。故在上面的
第8行中显然不正确,而应该是
     if(BlockIndex < Index->Drive->BlockPreDisk)              ---(8)
或者:
     if(BlockIndex < Drive->BlockPreDisk)              ---(8)

意思是块的物理索引在不超过所有块总数的前提下才执行后续的操作。

使用特权

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

本版积分规则

22

主题

62

帖子

2

粉丝