Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: EFSL. Неверно читаются файлы более 32kb.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
scout
EFSL на Atmega 128. Версия библиотеки вроде 0.2.8, но не совсем уверен.

Проблема в следующем. Если отформатировать SD карту(2Gb) как FAT16, то читаются только первые 32kb, дальше идет мусор.
Если стоит FAT32, то все работает нормально. Эксперименты показали, что при чтении библиотека читает один и тот же кластер,
а должна идти по их цепочке. Кто сталкивался с таким багом и как это лечится?
sergeeff
Советую побыстрее мигрировать на FatFS. EFSL работает существенно медленнее из-за посекторного чтения/записи. сам код более объемный. Последние годы этим проектом авторы не занимаются.
scout
Скорость меня устраивает, в следующих проектах я планировал перейти на нее. А в текущем проекте не хотелось бы что то перекраивать...
sergeeff
Самая последняя версия EFSL 0.3.6 : http://sourceforge.net/projects/efsl/. Посмотри, там многие ошибки были поправлены.
scout
Попробовал последовать вашему совету и поставить EFSL 0.3.6. Линкер ругается на ф-ю part_getRealLBA(), которая вызывается в partition.c.
Прошелся поиском, действительно, тела ф-и нигде нет...
sergeeff
Код
/* ****************************************************************************  
* euint32 part_getRealLBA(Partition *part,euint32 address)
* Description: This function calculates what the partition offset for
* a partition is + the address.
* Return value: Sector address.
*/
euint32 part_getRealLBA(Partition *part,euint32 address)
{
//   euint32 d = part->disc->partitions[part->activePartition].LBA_begin + address;
//   printf("part_getRealLBA :: LBA_begin = %d | addr = %d[%08X]\n",
//           part->disc->partitions[part->activePartition].LBA_begin, d, d);
   return(part->disc->partitions[part->activePartition].LBA_begin + address);
}
scout
Спасибо, проблема решена. Оставил исходную версию. Проблема была в следующем участке кода:

Код
euint32 file_fread(File *file,euint32 offset, euint32 size,euint8 *buf)
{
    euint32 bytes_read=0,size_left=size,coffset=offset;
    euint32 cclus,csec,cbyte;
    euint32 rclus,rsec;
    euint32 btr;
    euint8 *tbuf;
        
    if(!file_getAttr(file,FILE_STATUS_OPEN))return(0);
    
    if(offset>=file->FileSize)
        size_left=0; /* Offset check */
    
    if( (offset+size > file->FileSize) && size_left!=0)
        size_left=file->FileSize-offset;
    
    while(size_left>0){
    
        cclus = coffset/(512UL*file->fs->volumeId.SectorsPerCluster);
        csec = (coffset/(512))%file->fs->volumeId.SectorsPerCluster;
        cbyte = coffset%512;
        
        if(cbyte!=0 || size_left<512){
            btr = 512-(coffset%512)>=size_left?size_left:512-(coffset%512);
        }else{
            btr = 512;
        }

        if((fat_LogicToDiscCluster(file->fs,&(file->Cache),cclus))!=0){
            return(0);
        }

        rclus=file->Cache.DiscCluster;
        rsec=fs_clusterToSector(file->fs,rclus);

        
        if(btr==512){
            /*part_readBuf(file->fs->part,rsec+csec,buf+bytes_read);*/
            part_directSectorRead(file->fs->part,rsec+csec,buf+bytes_read);
        }else{
            /*part_readBuf(file->fs->part,rsec+csec,tbuf);*/
            tbuf = part_getSect(file->fs->part,rsec+csec,IOM_MODE_READONLY);
            memCpy(tbuf+(coffset%512),buf+bytes_read,btr);
            part_relSect(file->fs->part,tbuf);
        }
        
        coffset+=btr;
        bytes_read+=btr;
        size_left-=btr;
    }
        
    return(bytes_read);
}


Код
cclus = coffset/(512UL*file->fs->volumeId.SectorsPerCluster);


Было просто 512. На FAT32 работало потому, что выбирался меньший размер кластера.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.