⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 davrcvpr.c

📁 Flash file system
💻 C
📖 第 1 页 / 共 3 页
字号:
      /* Haven't started copying the FROM object yet.      */
      from_addr_method = UseCurrObject;
      to_addr_method = UseNextObject;
   }      
      
   /*************************************************/
   /*** (5) RIP/CIP                               ***/
   /*************************************************/
   if ((RecoverState.FROMInput | RecoverState.TOInput) ==
              (FROM_ObjectReclaimInProgress | TO_ObjectCopyInProgress))
   {      
      #ifdef PRINT_ON   
         printf("(5) RIP/CIP");
      #endif
      EVT_CountOccurance(EVT_RECRCVR_State5);
      
      /* We were copying the from object to the to object. */
      from_addr_method = UseCurrObject;
      to_addr_method = UseCurrObject;
   }
   
   #ifdef PRINT_ON
      printf(", ");
   #endif
   
   /*************************************************/
   /*** Calculate actual TO & FROM address        ***/
   /*************************************************/
   /*************************************************/
   /*** (A) Previous From/Current To              ***/
   /*************************************************/
   if (from_addr_method == UsePrevHeader)
   {
      #ifdef PRINT_ON   
         printf("PrevFrom/CurrTO (A)");
      #endif
      EVT_CountOccurance(EVT_RECRCVR_StateA);
      
      if (to_addr_method != UseCurrObject)
      {
         return ERR_SYSTEM;
      }
      
      ReclaimState.HeaderCopied = TRUE;
      ReclaimState.MarkHeaderCopyComplete = TRUE;
      
      /* The FROMObject header has been erased, use the    */
      /*  header information from the TO object.           */
      FLASH_ReadBuffer(RecoverState.TOObject.HeaderAddress,
                   (MemBufferPtr)&SearchHeader, HDR_FixedSize);

      status = UINT16_HeaderFixISF_PLR( &(SearchHeader.Attr16), 
        (RecoverState.TOObject.HeaderAddress + HDR_OffsetToAttr16), restart);
      if(status)
      {
         return status;
      }    
      /*fix header ID*/
      status = UINT16_FixISF_PLR( &(SearchHeader.HeaderId), 
        (RecoverState.TOObject.HeaderAddress + HDR_OffsetToHeaderId), restart);             
      if(status)
      {
         return status;
      }  

      
      /* Adjust the FROM header address to point to the    */
      /*  location where the previous FROM object resided. */
      RecoverState.FROMObject.HeaderAddress += 
                        HDR_CalcHdrSize(SearchHeader.NameSize);

      if (HDR_GetAlignmentAttr(SearchHeader.Attr16) == 
                                             HDR_HA_AlignPara)
      {
         RecoverState.FROMObject.HeaderAddress += 
                              RecoverState.TOObject.ObjectSize;
      }
       
      MemMap.FreeBlk.BaseAddr = 
              RecoverState.TOObject.HeaderAddress - 1;
                                          
      ReclaimState.ObjectHiAddr = 
              RecoverState.FROMObject.HeaderAddress - 1;
       
      /* Adjust the free flash base by the amount of the object */
      /*  that is known to be copied in FROM space, also adjust */
      /*  the copy from pointer.                                */
      if (top_of_from_block < ReclaimState.ObjectHiAddr)
      {
         pre_block_bytes = ReclaimState.ObjectHiAddr - 
                                             top_of_from_block;

         ReclaimState.ObjectHiAddr -= pre_block_bytes;
         MemMap.FreeBlk.BaseAddr -= pre_block_bytes;
      }
   }
   else  /* end UsePrevHeader */
   {
      if (from_addr_method == UseCurrObject)
      {
         #ifdef PRINT_ON
            printf("CurrFROM/");
         #endif              
         
         ReclaimState.HeaderCopied = FALSE;
         switch (to_addr_method)
         {
            /**************************************************/
            /*** (B) Current From/Curr To                   ***/
            /**************************************************/
            case UseCurrObject:
               EVT_CountOccurance(EVT_RECRCVR_StateB);
            
               #ifdef PRINT_ON
                  printf("CurrTO (B)");
               #endif              
            
               /* Assumes SearchHeader already contains FROM object */
               /*  information.                                     */
               /* If not: the uncomment the following:              */
               /*
               FLASH_ReadBuffer(RecoverState.FROMObject.HeaderAddress,
                           (MemBufferPtr)&SearchHeader, HDR_FixedSize);
               */
         
            break;
            
            /**************************************************/
            /*** (C) Current From/Next To                   ***/
            /**************************************************/
            case UseNextObject:
               #ifdef PRINT_ON
                  printf("NextTO (C)");
               #endif              
               
               EVT_CountOccurance(EVT_RECRCVR_StateC);
               
               FLASH_ReadBuffer(RecoverState.TOObject.HeaderAddress,
                               (MemBufferPtr)&TempHeader, HDR_FixedSize);

              status = UINT16_HeaderFixISF_PLR( &(TempHeader.Attr16), 
                (RecoverState.TOObject.HeaderAddress + HDR_OffsetToAttr16), restart);
              if(status)
              {
                  return status;
              }  
                
              /*fix header ID*/
              status = UINT16_FixISF_PLR( &(TempHeader.HeaderId), 
                (RecoverState.TOObject.HeaderAddress + HDR_OffsetToHeaderId), restart);       
              if(status)
              {
                  return status;
              }  
                    
              /* Set our FreeBlk.BaseAddr to the first byte following */
              /*  the current TO Object.                              */
              RecoverState.TOObject.HeaderAddress = 
                  HDR_CalcNextHdrAddr(
                       RecoverState.TOObject.HeaderAddress,
                           (UINT16)HDR_GetAlignmentAttr((TempHeader.Attr16)), 
                                 TempHeader.NameSize, 
                                       RecoverState.TOObject.ObjectSize);
         
            break;
            
            /**************************************************/
            /*** (D) Current From/No To                     ***/
            /**************************************************/
            case UseNoObject:
               
               EVT_CountOccurance(EVT_RECRCVR_StateD);
               
               #ifdef PRINT_ON
                  printf("NoTO (D)");
               #endif              
               
               RecoverState.TOObject.HeaderAddress = 
                      Block2Handle((RecoverState.TOBlock + 1)) - 
                                                          HDR_FixedSizeP;
            break;

            case UsePrevHeader:
            case UseDummyObject:       
            default:
               #ifdef PRINT_ON
                  printf("ERR");
               #endif              
               
               return ERR_SYSTEM;
         } /* end switch */
         
         MemMap.FreeBlk.BaseAddr = 
              RecoverState.TOObject.HeaderAddress + (HDR_FixedSizeP - 1);
      }
      else /* end UseCurrObject */
      {
         /**************************************************/
         /*** (E) Dummy From/Next To                     ***/
         /**************************************************/
         #ifdef PRINT_ON
            printf("DummyFROM/NextTO (E)");
         #endif   
         
         EVT_CountOccurance(EVT_RECRCVR_StateE);
         
         if (to_addr_method != UseNextObject)
         {
            return ERR_SYSTEM;
         }
                    
         ReclaimState.HeaderCopied = TRUE;
         
         /* Create a dummy Invalid header. */
         HDR_InitHeaderAttr16(SearchInfo.HeaderPtr->Attr16);
         HDR_InitHeaderAttr8(SearchInfo.HeaderPtr->Attr8);
         
         SearchInfo.HeaderPtr->NameSize = 0;
         
         RecoverState.FROMObject.HeaderAddress = 
             (Block2Handle((RecoverState.FROMBlock + 1)) + 
                                   HDR_FixedSizeP) - FDI_ParagraphLength;

         SearchInfo.CurrObj.ObjectSize = 
                 RecoverState.FROMObject.HeaderAddress -
                     (SearchInfo.CurrObj.HeaderAddress + HDR_FixedSizeP);
         
         SearchInfo.HeaderPtr->Attr16 = 
             HDR_SetAlignmentAttr((SearchInfo.HeaderPtr->Attr16), 
                                                       HDR_HA_AlignPara);
         
         HDR_SetObjectSize(SearchInfo.HeaderPtr, 
                  (SearchInfo.CurrObj.ObjectSize / FDI_ParagraphLength));
         
         SearchInfo.HeaderPtr->Attr16 = 
             HDR_SetStatusAttr((SearchInfo.HeaderPtr->Attr16), 
                                                         HDR_HA_Invalid);
         
         /* from_addr_method == UseDummyObject */
         ReclaimState.MarkHeaderCopyComplete = FALSE;
         
         FLASH_ReadBuffer(RecoverState.TOObject.HeaderAddress,
                         (MemBufferPtr)&TempHeader, HDR_FixedSize);
         status = UINT16_HeaderFixISF_PLR( &(TempHeader.Attr16), 
           (RecoverState.TOObject.HeaderAddress+HDR_OffsetToAttr16), restart);
         if(status)
         {
            return status;
         }  
      
           /*fix header ID*/
         status = UINT16_FixISF_PLR( &(TempHeader.HeaderId), 
           (RecoverState.TOObject.HeaderAddress + HDR_OffsetToHeaderId), restart);                                
         if(status)
         {
            return status;
         }  
          
                      
         /* Set our FreeBlk.BaseAddr to the first byte following */
         /*  the current TO Object.                              */
         RecoverState.TOObject.HeaderAddress = 
             HDR_CalcNextHdrAddr(
                   RecoverState.TOObject.HeaderAddress,
                        (UINT16)HDR_GetAlignmentAttr((TempHeader.Attr16)), 
                              TempHeader.NameSize, 
                                       RecoverState.TOObject.ObjectSize);

         MemMap.FreeBlk.BaseAddr = 
              RecoverState.TOObject.HeaderAddress + (HDR_FixedSizeP - 1);
      } /* end UseDummyObject */
   } 

   #ifdef PRINT_ON   
      printf("\n");
   #endif   
   
   if (Handle2Block(RecoverState.TOObject.HeaderAddress) ==
                                  Handle2Block(FDI_ReclaimBlockAddress))
   {
      ReclaimState.HeaderInRecBlk = TRUE;
   }
         
   /* Make adjustments to the FreeBlk and RecBlk vars depending       */
   /*  on whether the FreeBlk.BaseAddr points into the reclaim block. */
   MemMap.RecBlk.BaseAddr = FDI_ReclaimBlockAddress + 
                                                  FDI_BlockSize - 1;
   
   if (Handle2Block(MemMap.FreeBlk.BaseAddr) ==
                                           RecoverState.FROMBlock)
   {
      if (RecoverState.TOBlock != RecoverState.FROMBlock)
      {
         return ERR_SYSTEM;
      }
      
      MemMap.RecBlk.BaseAddr = 
         FDI_ReclaimBlockAddress + (MemMap.FreeBlk.BaseAddr - 
                              BlockAlign(MemMap.FreeBlk.BaseAddr));
      MemMap.FreeBlk.BaseAddr = 
                    Block2Handle((RecoverState.TOBlock + 1)) - 1;
   }
   
   if (Handle2Block(MemMap.FreeBlk.BaseAddr) ==
                         Handle2Block(FDI_ReclaimBlockAddress))
   {
      if (RecoverState.TOBlock != RecoverState.FROMBlock)
      {
         return ERR_SYSTEM;
      }
      
      /* Beginning of object (header) is in reclaim block.    */
      /*  Must move FreeBlk.BaseAddr back to the TOBlock and  */
      /*  set the reclaim block base to whatever the free blk */
      /*  base is.                                            */
      MemMap.RecBlk.BaseAddr = MemMap.FreeBlk.BaseAddr;
      MemMap.FreeBlk.BaseAddr = 
                    Block2Handle((RecoverState.TOBlock + 1)) - 1;
   }

   MemMap.FreeBlk.BytesFree = MemMap.FreeBlk.BaseAddr - 
                                                 top_of_from_block;
   
   MemMap.RecBlk.BytesUsed = (FDI_ReclaimBlockAddress + 
                     FDI_BlockSize - 1) - MemMap.RecBlk.BaseAddr;

   HDR_GetObjectSize(SearchInfo.HeaderPtr, 
                                   &SearchInfo.CurrObj.ObjectSize);
                               
   SearchInfo.CurrObj.HeaderAddress = 
                             RecoverState.FROMObject.HeaderAddress;

   SearchInfo.CurrObj.ObjectAddress = 
      HDR_CalcNextHdrAddr(SearchInfo.CurrObj.HeaderAddress, 
          (UINT16)HDR_GetAlignmentAttr((SearchInfo.HeaderPtr->Attr16)), 
                                SearchInfo.HeaderPtr->NameSize, 
                                 SearchInfo.CurrObj.ObjectSize) +
                                                      HDR_FixedSizeP;
                             
   ReclaimState.TargetHeaderAddress = RecoverState.TOObject.HeaderAddress;
   ReclaimState.NextState = (UINT16)RECLAIM_ST_ReadNextObj;
   
   return status;
}

#endif /* DIRECT_ACCESS_VOLUME */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -