繁体   English   中英

文件系统,磁盘输出意外写入/读取

[英]File system, unexpected write/read on disk output

我已经研究了3天,看不到错误,我需要崭新的眼睛:)我从事在线嵌入式课程的研究,在这个特定的实验室中,我们需要实现文件系统。 如主函数中的代码注释所述,我得到了意外的结果。 (E =预期,R =结果)

写/读功能:

#define EDISK_ADDR_MIN      0x00020000  // Flash Bank1 minimum address
#define EDISK_ADDR_MAX      0x0003FFFF  // Flash Bank1 maximum address
// Write an array of 32-bit data to flash starting at given address.
 int Flash_FastWrite(uint32_t *source, uint32_t addr, uint16_t count)
{
 uint32_t flashkey;
 uint32_t volatile *FLASH_FWBn_R = (uint32_t volatile*)0x400FD100;
 int writes = 0;
  if(MassWriteAddrValid(addr))
 {
  DisableInterrupts();  // may be optional step
  while(FLASH_FMC2_R&FLASH_FMC2_WRBUF){}; // wait for hardware idle
   while((writes < 32) && (writes < count))
  {
   FLASH_FWBn_R[writes] = source[writes];
   writes = writes + 1;
  }
  FLASH_FMA_R = addr;
  if(FLASH_BOOTCFG_R&FLASH_BOOTCFG_KEY)  // by default, the key is 0xA442
   flashkey = FLASH_FMC_WRKEY;
  else                                  // otherwise, the key is 0x71D5
   flashkey = FLASH_FMC_WRKEY2;
  FLASH_FMC2_R = (flashkey|FLASH_FMC2_WRBUF);    // start writing
  while(FLASH_FMC2_R&FLASH_FMC2_WRBUF){};
  EnableInterrupts();
 }
  return writes;
}

// Write 1 sector of 512 bytes of data to the disk, data comes from RAM
enum DRESULT eDisk_WriteSector(
const uint8_t *buff,  // Pointer to the data to be written
uint8_t sector){     // sector number
uint32_t addr;
uint32_t *copybuff;
copybuff =(uint32_t*)(buff);//Flash_WriteArray needs uint32_t format
addr=EDISK_ADDR_MIN+(512*sector);// starting ROM address 
if(addr>EDISK_ADDR_MAX) // return RES_PARERR if exceeds 
    return RES_PARERR;
Flash_WriteArray(copybuff, addr, 512);// write 512 bytes from RAM into ROM                                       
                                      // written by the instructor.
return RES_OK;
}

// Read 1 sector of 512 bytes from the disk, data goes to RAM
enum DRESULT eDisk_ReadSector(
uint8_t *buff,     // Pointer to a RAM buffer into which to store
uint8_t sector){        // sector number to read from
        uint16_t i;
        uint8_t *diskpt;
diskpt=(uint8_t *)(EDISK_ADDR_MIN+512*sector);      // starting ROM address 
if(EDISK_ADDR_MIN+512*sector>EDISK_ADDR_MAX)    
    return RES_PARERR;
else
 {
    for ( i = 0; i < 512; i++ )// copy 512 bytes from ROM into RAM
        buff[i] = *diskpt++;
    return RES_OK;
 }
}
enum DRESULT eDisk_Format(void){
// erase all flash from EDISK_ADDR_MIN to EDISK_ADDR_MAX
for(uint32_t i=EDISK_ADDR_MIN;i<=EDISK_ADDR_MAX;i++)
    Flash_Erase(i);
return RES_OK;
}

uint8_t Buff[512];
 int main(void)
{
 eDisk_Init(0); // if(drive == 0){return RES_OK;}             
 eDisk_Format();
 testbuildbuff("auf0");
 eDisk_WriteSector(Buff,0); 
 testbuildbuff("Excelent"); // writes "Excelent" onto Buff
 eDisk_WriteSector(Buff,1); 
 testbuildbuff("bus3");
 eDisk_WriteSector(Buff,2);
 testbuildbuff("bus4");
 eDisk_WriteSector(Buff,3);
 // E=expected. R=result
 eDisk_ReadSector(Buff, 0); //E: Buff="auf0" R:Buff="auf0"
 eDisk_ReadSector(Buff, 1); //E: Buff="Excelent" R: Buff is empty
 eDisk_ReadSector(Buff, 2); //E: Buff="bus3" R: Buff is empty
 eDisk_ReadSector(Buff, 3); //E: Buff="bus4" R: 4Buff is empty
 return 0;
}

簧片后的Buff效果出乎意料。 为什么它对0有效,但对其他无效?

更奇怪的是,当我运行此测试时:

testbuildbuff("auf0 buf1 buf2");
eDisk_WriteSector(Buff,2); 
testbuildbuff("Excelent");
eDisk_WriteSector(Buff,1); 
testbuildbuff("bus3");
eDisk_WriteSector(Buff,3);
testbuildbuff("bus4");
eDisk_WriteSector(Buff,4);
eDisk_ReadSector(Buff, 4); //Buff is empty
eDisk_ReadSector(Buff, 3); //Buff is empty
eDisk_ReadSector(Buff, 2); //Buff = "auf0 buf1 buf2"
eDisk_ReadSector(Buff, 1); //Buff = "Excelent"

怎么了?

PS:IDE Keil uVision v5.2,uC:TM4C123

问题出在函数Flash_WriteArray()的调用上。 在Flash_WriteArray()中,最后一个参数应该是我们要写入的字数(32位或4个字节)。 要写入512字节,此参数应为128(512/4)。

如果您的cpu是big endian,则写单词和读取字节可能会给您带来endian问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM