打印

STM32固件库,Nand_if.c文件下的NAND_BuildLUT函数问题

[复制链接]
5015|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
夜夜|  楼主 | 2010-4-15 14:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32固件库,Nand_if.c文件下的NAND_BuildLUT函数调试中出现问题,
即函数最后的那个do{}while ( pFreeBlock < MAX_PHY_BLOCKS_PER_ZONE );
循环中pFreeBlock 会导致LUT 数组溢出,但是我看了好久没明白这段代码的意思;
无从修改。
不知道有没有谁移植过这段程序,望指点一二。
/*******************************************************************************
* Function Name  : NAND_BuildLUT
* Description    : Build the look up table
* Input          : None
* Output         : None
* Return         : Status
* !!!! NOTE : THIS ALGORITHM IS A SUBJECT OF PATENT FOR STMICROELECTRONICS !!!!!
*******************************************************************************/
static uint16_t NAND_BuildLUT (uint8_t ZoneNbr)
{
  uint16_t  pBadBlock, pCurrentBlock, pFreeBlock;
  SPARE_AREA  SpareArea;
  /*****************************************************************************
                                  1st step : Init.
  *****************************************************************************/
  /*Init the LUT (assume all blocks free) */
  for (pCurrentBlock = 0 ; pCurrentBlock < MAX_PHY_BLOCKS_PER_ZONE ; pCurrentBlock++)
  {
    LUT[pCurrentBlock] = FREE_BLOCK;  /* 12th bit is set to 1 */
  }
  /* Init Pointers */
  pBadBlock    = MAX_PHY_BLOCKS_PER_ZONE - 1;
  pCurrentBlock = 0;
  /*****************************************************************************
                         2nd step : locate used and bad blocks
  *****************************************************************************/
  while (pCurrentBlock < MAX_PHY_BLOCKS_PER_ZONE)
  {
    SpareArea = ReadSpareArea(pCurrentBlock * NAND_BLOCK_SIZE + (ZoneNbr * NAND_BLOCK_SIZE * MAX_PHY_BLOCKS_PER_ZONE));
    if ((SpareArea.DataStatus == 0) || (SpareArea.BlockStatus == 0))
    {
      LUT[pBadBlock--]    |= pCurrentBlock | (uint16_t)BAD_BLOCK ;
      LUT[pCurrentBlock] &= (uint16_t)~FREE_BLOCK;
      if (pBadBlock == MAX_LOG_BLOCKS_PER_ZONE)
      {
        return NAND_FAIL;
      }
    }
    else if (SpareArea.LogicalIndex != 0xFFFF)
    {
      LUT[SpareArea.LogicalIndex & 0x3FF] |= pCurrentBlock | VALID_BLOCK | USED_BLOCK;
      LUT[pCurrentBlock] &= (uint16_t)( ~FREE_BLOCK);
    }
    pCurrentBlock++ ;
  }
    printf("2nd step\r\n");
  /*****************************************************************************
     3rd step : locate Free Blocks by scanning the LUT already built partially
  *****************************************************************************/
  pFreeBlock = 0;
  for (pCurrentBlock = 0 ; pCurrentBlock < MAX_PHY_BLOCKS_PER_ZONE ; pCurrentBlock++ )
  {
    if ( !(LUT[pCurrentBlock]& USED_BLOCK))
    {
      do
      {
        if (LUT[pFreeBlock] & FREE_BLOCK)
        {
          LUT [pCurrentBlock] |= pFreeBlock;
          LUT [pFreeBlock]   &= ~FREE_BLOCK;
          break;
        }
        pFreeBlock++;
               
      }
      while ( pFreeBlock < MAX_PHY_BLOCKS_PER_ZONE );
      
    }
  }
   
  return NAND_OK;
}
沙发
tiger84| | 2010-5-14 16:44 | 只看该作者
老相识了,顶下。
应该已经搞定了吧。
但刚好也在研究nandflash及fs,也说下。
“即函数最后的那个do{}while ( pFreeBlock < MAX_PHY_BLOCKS_PER_ZONE );
循环中pFreeBlock 会导致LUT 数组溢出”
肯定不会溢出的。
这个函数的功能就是建立了一个逻辑上的块表。最终的效果就是在LUT数组里面,好块(包括已经用的和没用的)在前面,坏块都扔到后面去了。如果坏块数超过24块了,这个nand也就报销了。

使用特权

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

本版积分规则

个人签名:一庭芳草围新绿 有情芍药含春泪

14

主题

63

帖子

1

粉丝