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

📄 kw_fat32.lst

📁 linux下数据下载器的设计与实现
💻 LST
📖 第 1 页 / 共 4 页
字号:
 391   4                              }
 392   3                          pDir ++;
 393   3                      }
 394   2              }
 395   1              return 0;
 396   1      }
 397          
 398          /************************************************************************************* 
 399            Function:       FM_WriteData2Clu
 400            Description:    写数据到簇中
 401            Called By:      
 402            Input:          Clu@WORD:簇号
 403                                            pBuffer@BYTE *:数据
 404                                            Length@WORD:数据长度
 405                                            Start@WORD: 起始偏移
 406            Output:         N/A
 407            Return:         1:成功,0:失败
 408            Others:         
 409          *************************************************************************************/
 410          bit FM_WriteData2Clu(WORD Clu, BYTE * pBuffer, WORD Length,WORD Start)
 411          {
 412   1              xdata WORD tmp;
 413   1              xdata DWORD fp_start_sector;
 414   1      
 415   1              if((Start + Length) > FM_sectors_clus * 512)                                    //如果当前簇不够则返回
 416   1              {
 417   2                      return 0;
 418   2              }
 419   1      
 420   1              fp_start_sector = (Clu-2) * FM_sectors_clus + FM_ptr_data;              //计算开始扇区  
 421   1              fp_start_sector += Start/512;                                                                   //加上偏移量所占扇区
 422   1      
 423   1              Start = Start - Start/512*512;                                                                  //计算扇区内偏移
 424   1              tmp = 512 - Start;                                                                                              //当前扇区剩余量
 425   1              
 426   1              while(Length)
C51 COMPILER V7.50   KW_FAT32                                                              10/12/2007 17:05:47 PAGE 8   

 427   1              {
 428   2                      if(Start != 0)                                                                                          //如果不是从扇区起始开始写
 429   2                      {
 430   3                              NM_ReadPage(fp_start_sector);                                                   //则需要读当前扇区
 431   3                      }
 432   2      
 433   2                      if(Length > tmp)                                                                                        //如果当前扇区不足写下所有数据
 434   2                      {
 435   3                              NM_WritePagesFromBuff(fp_start_sector,pBuffer,Start,tmp);
 436   3                              pBuffer += tmp;                                                                                 //则写满当前扇区
 437   3                              Length -= tmp;
 438   3                      }
 439   2                      else
 440   2                      {                                                                                                                       //否则写全部数据并可以返回
 441   3                              NM_WritePagesFromBuff(fp_start_sector,pBuffer,Start,Length);
 442   3                              pBuffer += tmp;
 443   3                              Length = 0;
 444   3                      }
 445   2      
 446   2                      fp_start_sector ++;                                                                                     //获取下一扇区
 447   2                      tmp = 512;                                                                                                      //设置下一扇区剩余空间为512
 448   2                      Start = 0;                                                                                                      //设置下一扇区起始偏移为0
 449   2              }
 450   1              return 1;
 451   1      }
 452          
 453          /************************************************************************************* 
 454            Function:       FM_SetNextClu
 455            Description:    设置当前簇的下簇地址,用于建立簇链
 456            Called By:      
 457            Input:          Current@WORD:当前簇号
 458                                            Next@WORD:下一簇号
 459            Output:         N/A
 460            Return:         1:成功,0:失败
 461            Others:         
 462          *************************************************************************************/
 463          bit FM_SetNextClu(WORD Current, WORD Next)
 464          {
 465   1              WORD xdata * pTmp;
 466   1      
 467   1              NM_ReadPage(FM_ptr_fats+((Current>>8)&0xff));                                   //读取当前簇
 468   1              pTmp = (WORD *)EP6FIFOBUF;
 469   1              pTmp[Current&0xff] = ((Next>>8)&0xff) | ((Next&0xff)<<8);               //设置下簇
 470   1              NM_WritePages(FM_ptr_fats+((Current>>8)&0xff));                                 //回写
 471   1              return 1;
 472   1      }
 473          
 474          /************************************************************************************* 
 475            Function:       FM_WriteFile
 476            Description:    写数据到当前已打开的文件中,追加方式
 477            Called By:      
 478            Input:          Buffer@BYTE*:数据
 479                                            Length@WORD:长度
 480            Output:         N/A
 481            Return:         1:成功,0:失败
 482            Others:         
 483          *************************************************************************************/
 484          bit FM_WriteFile(BYTE * Buffer, WORD Length)
 485          {
 486   1              DWORD xdata i;
 487   1              WORD xdata tmpClu,Start,tmp;
 488   1              WORD xdata LastClu = 0; 
C51 COMPILER V7.50   KW_FAT32                                                              10/12/2007 17:05:47 PAGE 9   

 489   1              if(FM_CurrentDirLBA == 0 || FM_pCurrentDir == 0)                                //如果当前打开文件不存在则返回
 490   1              {
 491   2                      return 0;
 492   2              }
 493   1      
 494   1              NM_ReadPage(FM_CurrentDirLBA);                                                                  //读取文件目录,并获取文件长度
 495   1              ((BYTE *)&FM_CurrentFileLength)[0] = FM_pCurrentDir->FileLength[3];
 496   1              ((BYTE *)&FM_CurrentFileLength)[1] = FM_pCurrentDir->FileLength[2];
 497   1              ((BYTE *)&FM_CurrentFileLength)[2] = FM_pCurrentDir->FileLength[1];
 498   1              ((BYTE *)&FM_CurrentFileLength)[3] = FM_pCurrentDir->FileLength[0];     
 499   1              
 500   1              ((BYTE *)&LastClu)[0] = FM_pCurrentDir->StartClus[1];                   //获取首簇
 501   1              ((BYTE *)&LastClu)[1] = FM_pCurrentDir->StartClus[0];
 502   1      
 503   1      
 504   1              //计算簇链尾
 505   1              for(i = 0; i<(FM_CurrentFileLength/(FM_sectors_clus * 512)); i++)
 506   1              {
 507   2                      tmpClu = FM_GetNextClus(LastClu);
 508   2                      if(tmpClu == 0xffff)
 509   2                              break;
 510   2                      LastClu = tmpClu;
 511   2              }
 512   1      
 513   1      
 514   1              if(tmpClu == 0xffff && Length > 0)                                                              //文件长度有效且末簇地址无效
 515   1              {
 516   2                      tmpClu = FM_GetFreeClu();                                                                       //这种情况较特殊,可能由于文件系统错误引起
 517   2                      while(tmpClu == 0  || tmpClu > 0xf900)                                          //需要重新分配簇
 518   2                      {
 519   3                              FM_DeleteFirstFile();
 520   3                              tmpClu = FM_GetFreeClu();
 521   3                      }
 522   2      
 523   2                      FM_SetNextClu(LastClu, tmpClu);
 524   2                      LastClu = tmpClu;
 525   2              }
 526   1      
 527   1      
 528   1              //计算末簇已使用字节数Start,以及剩余数tmp
 529   1              Start = FM_CurrentFileLength - FM_CurrentFileLength/(FM_sectors_clus * 512)*(FM_sectors_clus * 512);
 530   1              tmp = FM_sectors_clus * 512 - Start;
 531   1      
 532   1      
 533   1              while(Length)
 534   1              {
 535   2                      if(tmp < Length)                                                                                        //如果剩余数不足写完不数据
 536   2                      {
 537   3                              if(tmp != 0)                                                                                    //如果剩余数不为零则满当前簇
 538   3                              {
 539   4                                      FM_WriteData2Clu(LastClu, Buffer, tmp, Start);          
 540   4                              }
 541   3                              //Set Clu link
 542   3                              tmpClu = FM_GetFreeClu();                                                               //分配心簇
 543   3                              
 544   3                          while(tmpClu == 0  || tmpClu > 0xf900)                                      //当分配失败时删除文件
 545   3                              {
 546   4                                      FM_DeleteFirstFile();
 547   4                                      tmpClu = FM_GetFreeClu();
 548   4                              }
 549   3      
 550   3                              if(tmp == Length)                                                                               //如果当前簇足以写入全部数据
C51 COMPILER V7.50   KW_FAT32                                                              10/12/2007 17:05:47 PAGE 10  

 551   3                                      FM_SetNextClu(LastClu, 0xffff);                                         //则关闭促链
 552   3                              else
 553   3                              {
 554   4                                      FM_SetNextClu(LastClu, tmpClu);                                         //否则增加一个簇到链尾
 555   4                                      LastClu = tmpClu;
 556   4                              }
 557   3      
 558   3                              FM_CurrentFileLength += tmp;                                                    //设置文件大小
 559   3                              Buffer += tmp;                                                                                  //设置数据缓冲首地址
 560   3                              Length -= tmp;                                                                                  //设置剩余量
 561   3                              tmp = FM_sectors_clus * 512;                                                    //设置下簇容量
 562   3                              Start = 0;                                                                                              //设置下簇起始偏移
 563   3                       }
 564   2                       else
 565   2                       {
 566   3                              FM_WriteData2Clu(LastClu, Buffer, Length, Start);               //当前簇可以写完所有数据
 567   3                              FM_CurrentFileLength += Length;                                                 //写数据
 568   3                              break;
 569   3                       }                      
 570   2              }
 571   1              
 572   1              //close file
 573   1              NM_ReadPage(FM_CurrentDirLBA);                                                                  //回写文件目录,保存文件长度
 574   1              FM_pCurrentDir->FileLength[0] = ((BYTE *)&FM_CurrentFileLength)[3];
 575   1              FM_pCurrentDir->FileLength[1] = ((BYTE *)&FM_CurrentFileLength)[2];
 576   1              FM_pCurrentDir->FileLength[2] = ((BYTE *)&FM_CurrentFileLength)[1];
 577   1              FM_pCurrentDir->FileLength[3] = ((BYTE *)&FM_CurrentFileLength)[0];     
 578   1              NM_WritePages(FM_CurrentDirLBA);
 579   1      }
 580          
 581          
 582          /************************************************************************************* 
 583            Function:       FM_GetLastFileNameBySN
 584            Description:    按文件编号排序,获取最后一个文件名
 585            Called By:      
 586            Input:          N/A
 587            Output:         N/A
 588            Return:         void
 589            Others:         获取的文件名存放在全局变量   FM_FileName
 590          *************************************************************************************/

⌨️ 快捷键说明

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