Перейти к содержанию
    

fatfs, Как правильно, перезаписать данные, по ошибке

Добрый день, сделаю запись на sd, через sdio, бывают моменты что что запись(в SDIO) вешала все, сейчас все более менее отладил, и такие моменты исключил, но все же,

После "зависона" таймауту выходим, и из функции f_write выдается ошибка, как теперь правильно повторить, запись (можно в другой сектор), т.е дозапись в файл те данные которые не правильно записались.

1) зациклить функцию  f_write, но там надо у fp сбросить ошибку, такое(fileW.err=0;) как-то не правильно, как сделать правильно ?

            do{
                fileW.err=0;
                file_close=f_write(&fileW, &inbuf[0], 512, (void *)&bw);
                if(file_close!=FR_OK){
                  NOP;
                }
            }while(file_close!=FR_OK);

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, pokk сказал:

такое(fileW.err=0;) как-то не правильно, как сделать правильно ?

Правильно - найти причину ошибок.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, pokk сказал:

Добрый день, сделаю запись на sd, через sdio, бывают моменты что что запись(в SDIO) вешала все, сейчас все более менее отладил, и такие моменты исключил, но все же,

После "зависона" таймауту выходим, и из функции f_write выдается ошибка, как теперь правильно повторить, запись (можно в другой сектор), т.е дозапись в файл те данные которые не правильно записались.

1) зациклить функцию  f_write, но там надо у fp сбросить ошибку, такое(fileW.err=0;) как-то не правильно, как сделать правильно ?

Люблю программистов.

Чтобы понять как что-то сделать правильно нужно для начала понимать что мы делаем. Об этом не слова. 

Можно только предположить что мы должны получить отказоустойчивую запись на плохую флешку. Задача мягко говоря странная. В такие задачи ставят хорошие флешки и желательно не одну.

Но если решать как есть то алгоритм я вижу примерно так:
 

1. Пробуем запись. Если получилось то выходим. Если нет идём дальше.
2. Отмечаем как-то блок как повреждённый.

3. Проверяем есть ли у нас свободные блоки. Если нету то выходим с ошибкой записи.

4. Выбираем следующий блок и переходим к пункту 1. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 часов назад, MegaVolt сказал:

1. Пробуем запись. Если получилось то выходим. Если нет идём дальше.
2. Отмечаем как-то блок как повреждённый.

3. Проверяем есть ли у нас свободные блоки. Если нету то выходим с ошибкой записи.

4. Выбираем следующий блок и переходим к пункту 1. 

Этим должен заниматься контроллер NAND внутри SD.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 hours ago, jcxz said:

Правильно - найти причину ошибок. 

Именно. А если уж паче чаяния ошибка случилась, то правильно будет просто известить об этом пользователя.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...