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

 
 
> Fatfs и битые сектора, Как помечаются сбойные сектора в этой ФС?
Nikitoc
сообщение Nov 3 2010, 20:37
Сообщение #1


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Доброго времени суток. Собственно вопрос в теме. Никак не могу понять каким образом данная ФС помечает сбойные сектора? О том, что они маскируются вначале контроллером SD-карты рассказывали aaarrr и zltigo. Но когда запас на замену истощается эти сектора вылазят наружу и становятся головной болью ФС. В исходниках FatFs встречается, например такая запись (внутри функции f_write):
Код
if (disk_write(fp->fs->drv, fp->buf, fp->dsect, 1) != RES_OK)
    ABORT(fp->fs, FR_DISK_ERR);

где:
Код
#define LEAVE_FF(fs, res)    return res
#define    ABORT(fs, res)        { fp->flag |= FA__ERROR; LEAVE_FF(fs, res); }

Я так понимаю, что в случае неудачной записи, в структуре данного объекта FIL выставляется флаг FA_ERROR. И функция f_write возвращает FR_DISK_ERR. А дальше тупик. Объясните, пожалуйста, как будет вести себя FatFs при попытке повторной записи по данному адресу? Отмечается ли данный сектор как сбойный в FAT?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
jorikdima
сообщение Nov 12 2010, 22:38
Сообщение #2


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



У вас 100 лет прибор работать будет? Или бьете все время в один сектор/файл? Если второе, то проще иметь логику выбора сектора куда писать и периодически менять его. Если второе, то вас скорее всего не будет через 100 лет smile.gif
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Dec 15 2010, 19:47
Сообщение #3


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Танцы с бубном продолжаются. Недавно я столкнулся со таким приколом на FatFS: если на карточку записать несколько файлов посредством функций этой файловой системы, а потом удалить в Windows какой-нибудь (или все) файлик с этой карты, то FatFs освободившееся пространство не увидит. f_getfree возвращает такое же количество свободных кластеров как и до удаления файла. Интересно, откуда ноги растут? У кого-то такое уже было? При этом винда, естественно, все освободившееся пространство видит.
P.S. Карточка перед записью форматировалась как жесткий диск, средствами FatFs.

Сообщение отредактировал Nikitoc - Dec 15 2010, 20:01
Go to the top of the page
 
+Quote Post
_4afc_
сообщение Dec 16 2010, 07:24
Сообщение #4


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

Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565



Цитата(Nikitoc @ Dec 16 2010, 01:47) *
Танцы с бубном продолжаются. Недавно я столкнулся со таким приколом на FatFS: если на карточку записать несколько файлов посредством функций этой файловой системы, а потом удалить в Windows какой-нибудь (или все) файлик с этой карты, то FatFs освободившееся пространство не увидит. f_getfree возвращает такое же количество свободных кластеров как и до удаления файла. Интересно, откуда ноги растут? У кого-то такое уже было? При этом винда, естественно, все освободившееся пространство видит.
P.S. Карточка перед записью форматировалась как жесткий диск, средствами FatFs.


Поподробнее порядок действий опишите. Как вы одновременно работаете в Windows и микроконтроллером? Windows какой?

Что делает функция f_getfree? Считывает всю FAT таблицу и пробегая по ней суммирует все свободные кластеры? Обе таблицы?
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Dec 16 2010, 09:38
Сообщение #5


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Цитата(_4afc_ @ Dec 16 2010, 14:24) *
Поподробнее порядок действий опишите. Как вы одновременно работаете в Windows и микроконтроллером? Windows какой?

Есть мой девайс с подключенным разъемом SD. Вставляю карту в него и выполняю все вышеописанные операции форматирования и записи. Вставляю затем эсдшку в картридер и удаляю некоторые файлы. Windows XP (если форматировать с ее помощью - то карта форматируется как дискета, без MBR). На карте FAT32.
Цитата
Что делает функция f_getfree? Считывает всю FAT таблицу и пробегая по ней суммирует все свободные кластеры? Обе таблицы?

Вызывает chk_mount, а та в свою очередь вычитывает fsi сектор (его адрес находит в PBR, кажется) и по внутреннему полю этого сектора определяет количество свободных кластеров:
Код
   /* Get fsinfo if available */
   if (fmt == FS_FAT32) {
       fs->fsi_flag = 0;
      fs->fsi_sector = bsect + LD_WORD(fs->win+BPB_FSInfo);
      if (disk_read(fs->drv, fs->win, fs->fsi_sector, 1) == RES_OK &&
         LD_WORD(fs->win+BS_55AA) == 0xAA55 &&
         LD_DWORD(fs->win+FSI_LeadSig) == 0x41615252 &&
         LD_DWORD(fs->win+FSI_StrucSig) == 0x61417272) {
            fs->last_clust = LD_DWORD(fs->win+FSI_Nxt_Free);
            fs->free_clust = LD_DWORD(fs->win+FSI_Free_Count);
      }
   }

Я подозреваю, конечно, что Windows это делает по другому, но как не знаю. Если можно расскажите, как делать правильно.


Go to the top of the page
 
+Quote Post
DL36
сообщение Dec 18 2010, 16:55
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 460
Регистрация: 5-10-06
Из: Херсон
Пользователь №: 21 006



Сравните значение поля FSI_Free_Count (488 4) сектора FSInfo до и после стирания, может оно?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Nikitoc   Fatfs и битые сектора   Nov 3 2010, 20:37
- - goodwin   Ну во-первых такую флэшку надо выбрасывать немедле...   Nov 3 2010, 21:17
|- - Nikitoc   Цитата(goodwin @ Nov 4 2010, 00:17) Правд...   Nov 3 2010, 21:59
- - Nixon   Непонятно с чего вы решили, что проблемой сбойных ...   Nov 4 2010, 09:41
|- - Nikitoc   Цитата(Nixon @ Nov 4 2010, 13:41) Непонят...   Nov 4 2010, 10:16
- - Nikitoc   Мда. Немного покопавшись в исходниках я обнаружил ...   Nov 4 2010, 15:49
- - sigmaN   Да это нигде не реализовано. Вам же сказали, что с...   Nov 7 2010, 23:50
|- - _Pasha   Цитата(sigmaN @ Nov 8 2010, 03:50) Или вы...   Nov 8 2010, 07:04
|- - Nikitoc   Цитата(sigmaN @ Nov 8 2010, 03:50) Или вы...   Nov 12 2010, 22:12
- - Nikitoc   Цитата(DL36 @ Dec 18 2010, 23:55) Сравнит...   Dec 19 2010, 16:06


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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 13:29
Рейтинг@Mail.ru


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