реклама на сайте
подробности

 
 
> EFSL. Неверно читаются файлы более 32kb.
scout
сообщение Nov 11 2009, 19:19
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 120
Регистрация: 4-01-06
Из: Москва
Пользователь №: 12 837



EFSL на Atmega 128. Версия библиотеки вроде 0.2.8, но не совсем уверен.

Проблема в следующем. Если отформатировать SD карту(2Gb) как FAT16, то читаются только первые 32kb, дальше идет мусор.
Если стоит FAT32, то все работает нормально. Эксперименты показали, что при чтении библиотека читает один и тот же кластер,
а должна идти по их цепочке. Кто сталкивался с таким багом и как это лечится?


--------------------
То, что неясно, следует выяснить. То, что трудно творить, следует делать с великой настойчивостью.
Конфуций
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
sergeeff
сообщение Nov 11 2009, 20:04
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Советую побыстрее мигрировать на FatFS. EFSL работает существенно медленнее из-за посекторного чтения/записи. сам код более объемный. Последние годы этим проектом авторы не занимаются.
Go to the top of the page
 
+Quote Post
scout
сообщение Nov 11 2009, 20:23
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 120
Регистрация: 4-01-06
Из: Москва
Пользователь №: 12 837



Скорость меня устраивает, в следующих проектах я планировал перейти на нее. А в текущем проекте не хотелось бы что то перекраивать...


--------------------
То, что неясно, следует выяснить. То, что трудно творить, следует делать с великой настойчивостью.
Конфуций
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Nov 11 2009, 20:28
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Самая последняя версия EFSL 0.3.6 : http://sourceforge.net/projects/efsl/. Посмотри, там многие ошибки были поправлены.
Go to the top of the page
 
+Quote Post
scout
сообщение Nov 18 2009, 09:31
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 120
Регистрация: 4-01-06
Из: Москва
Пользователь №: 12 837



Попробовал последовать вашему совету и поставить EFSL 0.3.6. Линкер ругается на ф-ю part_getRealLBA(), которая вызывается в partition.c.
Прошелся поиском, действительно, тела ф-и нигде нет...


--------------------
То, что неясно, следует выяснить. То, что трудно творить, следует делать с великой настойчивостью.
Конфуций
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Nov 18 2009, 15:34
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Код
/* ****************************************************************************  
* 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);
}
Go to the top of the page
 
+Quote Post
scout
сообщение Nov 23 2009, 15:03
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 120
Регистрация: 4-01-06
Из: Москва
Пользователь №: 12 837



Спасибо, проблема решена. Оставил исходную версию. Проблема была в следующем участке кода:

Код
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 работало потому, что выбирался меньший размер кластера.


--------------------
То, что неясно, следует выяснить. То, что трудно творить, следует делать с великой настойчивостью.
Конфуций
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 11:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.01412 секунд с 7
ELECTRONIX ©2004-2016