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

 
 
> Разрушение FAT (в FatFs)
Allregia
сообщение Feb 10 2016, 15:53
Сообщение #1


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

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Странно ведет себя один приорчик на F407, FatFs R0.09, 2011г.
Пишется стрим на флешку, примерно гигабайт в час.
Запись разбита на "1 файл = пол часа".
Т.е. пол часа пишется в tmp файл, потом он переименовывается в реальное имя с номером, и дальше опять пишется в tmp файл.
Между файлами делается unmount/mount, проовали даже питание флешки выключать/ и включать снова.
И все как бы было ОК, пока мы писали свой стрим по часу-два. Все работало идеально, флешки в основном исползовали 2-4ГБ, иноогда 8ГБ

А когда попробовали писать подольше да на флешках 8-16ГБ - видим проблему, появляющуюся примерно через 5-6 часов. Девайс продолжает писать, но если его остановить, то флешка уже не читается, фат разрушена, в итоге -> ее под format.

Все вызываемые функции FatFs - с проверкой, что FR_ОК возвращается если нет - сообщение на дисплей.
И там ничего! Девайс может 10-14 часов писать (на 16ГБ флешку), потом его останавливешь - и всё, выяснить когда чего произошло уже не получается.
У нас с напарником (код исходной мой, 4-х летней давности, но сейчас он с этим девайсом возится) уже все мысли кончились, не только по тому как найти баг, но и вобще в каком направлении поисков двигаться! Ну разве что, попробовать поставить послеледнюю версию FatFs?

Ну не может же такого быть, чтобы если по какой-то причине слетел фат, что при этом все функции f_open, f_close, f_write, f_rename, f_mount возвращают FR_OK?!

Ни у кого небыло ничего подобного? Или мож кто чего умного подскажет, как дальше искать?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
редактор
сообщение Feb 12 2016, 12:33
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315



Цитата
ЧЕМ через 5 часов, "ЭТО", отличается от самого первого включения

тем что системное время насчитало 5 часов работы - может сбой в отсчете времени и как следствие проблемы с файлами?


--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Feb 15 2016, 11:41
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(редактор @ Feb 12 2016, 13:33) *
тем что системное время насчитало 5 часов работы - может сбой в отсчете времени и как следствие проблемы с файлами?

Эту тему я поддержу.
Насколько мне помнится, в FatFS есть циклы и таймауты в них. Последние должны реализовываться так, чтобы можно было прервать эти циклы, то есть, работать от прерываний и модифицировать флаги/переменные, анализируемые в циклах внутри FatFS. Например, в моей системе, которая есть синхронная round robin по типу protothreads, я вынужден был ответвиться от обработчика SystemTick, чтобы модифицировать то, что нужно для FatFS. Как раскрыта тема в системе у ТС? Может срабатывает какой-то таймаут раньше времени, потому что, например, 5 часов это 18000 секунд, а это около 16K, а если в 10мс тиках, то это 18мио тиков, что есть около 24-битного числа (а SysTick - это 24 бита). Это я выдаю нагорА всякий бред, но может что войдет в резонанс в голове у ТС...

Go to the top of the page
 
+Quote Post
Allregia
сообщение Feb 22 2016, 18:21
Сообщение #4


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

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Коллеги, большое спасибо за продолжение обсуждения, пока меня небыло (командировка).
Нашими усилиями было выяснено, что сбой происходит тогда, когда СУММАРНЫЙ обьем файлов перезодит через границу 4Гб.
Было попробовано на другом железе, со старой и новой FatFs, и даже двумя компиляторми (Кейл и ИАР).
Пробовали даже писать не в корневой каталог, а также с синком и без (тормозит он конкретно, если после каждого f_write вызывать!)
Писали блоками, равными кластеру (32К) - так быстрее всего.
От входных данных отвязались, и стали просто писать в цикле с максимальной скоростью - ну не ждать же 5-6 часов!

Может быть, у кого есть какая-нибудь система с сд-карточкой, работающей через sdio, может у себя попробовать, вот процедура, которую сегодня пробовали:
CODE
#define block_size 32768
#define blocks_in_mb (1024L*1024/block_size)
#define mb_in_file 500
//---
#define start_file 0
#define file_num 10
//
char fn[13];
//
void TestLog(void){
u32 i,j,k, bw;
FRESULT res;
//
Font=fnt16x8lat;
if(IsSDReady()){ // это просто проверка контакта, что карточка вставлена
SDPowerOn();
delay_ms(100);
if(CheckSD()){ // check OK
// test ------------------
ClrScr();
//f_chdir("/as");
for(i=start_file;i<file_num+start_file;i++){
sprintf((char *)fn, "/as/fn.%d",i);
res = f_open(&fsrc, fn, FA_CREATE_ALWAYS | FA_WRITE);
if(res==FR_OK){
SDFileOpen=1; // simulate working file
Show_String((u8 *)fn,2,0);

// record
for(j=0; j<mb_in_file;j++){
sprintf((char *)txt, "Rec: %d MB ",j+1);
Show_String(txt,6,0);

for(k=0;k<blocks_in_mb;k++){
res=f_write(&fsrc, &SDBuffer[0], block_size, &bw);
if(res!=FR_OK){
f_close(&fsrc);
sprintf((char *)txt, "Write Error:%d %d",j+1,k);
Show_String(txt,4,0);
while(1);
}
res=f_sync(&fsrc);
if(res!=FR_OK){
f_close(&fsrc);
sprintf((char *)txt, "Sync Error:%d %d",j+1,k);
Show_String(txt,4,0);
while(1);
}
}
}
res=f_close(&fsrc);
if(res!=FR_OK){
f_close(&fsrc);
sprintf((char *)txt, "Close error:%d %d",j,k);
Show_String(txt,4,0);
while(1);
}
}
}
//---------------------------------
Show_String("Write Complete", 0,0);
SDPowerOff();
while(1);
//------------------------------
}else{ // check fails
SDPowerOff();
ClrScr();// return;
return;
}
} // no SD
Show_String(" No SD Card ",2,0);
WaitNoKey();
WaitKey();
WaitNoKey();
ClrScr();
return;
}
//--------------------
// функция инициализирует и монтирует карточку:
static u8 CheckSD(u8 a){
SD_Error SDInitResult;
FRESULT res;
ClrScr();
SDInitResult=SD_Init();
if(SDInitResult==SD_OK){
Show_String("SD Init OK ",2,0);
delay_ms(1000);
res=f_mount( 0, &MSD_fatfs );
if ( res!= FR_OK ){
sprintf((char *)txt,"FS Fail %02d ",res);
Show_String(txt,4,10);
delay_ms(1000);
WaitNoKey();
WaitKey();
WaitNoKey();
return 0;
} // FS OK
Show_String("FS Mount ",4,0);
delay_ms(1000);
WaitNoKey();
return 1;
}
// SD Init fails:
sprintf((char *)txt,"SD Init Fail %02d",SDInitResult);
Show_String(txt,2,0);
delay_ms(1000);
WaitNoKey();
WaitKey();
WaitNoKey();
return 0;
}
//------------------------


Функции вывода на дисплей или ожидания кнопок можно закомментировать, или свои подставить.
У нас результаты такие: если file_num =8, то эти 8 байлов пишутся без проблем. Если 9 и больше - все проходит до конца без сообщений об ошибках, но карточка на компе уже не читается, просит форматирования.
Т.е сбой происходит в 9-ми файле. именно там переход границы 4Гб.
Но даже если поставить писать 10 файлов, то программа дорабатывает до конца без ошибок, хот ошибка по идее, была еще в 9-м!


Можно попробовать не сразу 9-10 файло в писать, а сначала
#define start_file 0
#define file_num 8

записать 8 файлов,
потом поставить:
#define start_file 8
#define file_num 1 // или 2

и дописать еще 1-2.


Каждый файл 500мб.

Сообщение отредактировал IgorKossak - Feb 23 2016, 09:06
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 22 2016, 19:00
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Allregia @ Feb 22 2016, 21:21) *
Нашими усилиями было выяснено, что сбой происходит тогда, когда СУММАРНЫЙ обьем файлов перезодит через границу 4Гб.

Попробуйте на нижнем уровне записать сектор с адресом 4Гб, не перезапишется ли на самом деле нулевой?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Allregia   Разрушение FAT (в FatFs)   Feb 10 2016, 15:53
- - Ruslan1   Цитата(Allregia @ Feb 10 2016, 17:53) Ни ...   Feb 10 2016, 21:01
|- - Allregia   Цитата(Ruslan1 @ Feb 10 2016, 22:01) 0. п...   Feb 11 2016, 15:59
|- - mantech   Цитата(Allregia @ Feb 11 2016, 18:59) 2: ...   Feb 11 2016, 21:00
|- - Allregia   Цитата(mantech @ Feb 11 2016, 22:00) Попр...   Feb 12 2016, 08:20
|- - Alechek   Цитата(Allregia @ Feb 12 2016, 13:20) ЧЕМ...   Feb 12 2016, 09:23
|- - Allregia   Цитата(Alechek @ Feb 12 2016, 10:23) Маги...   Feb 12 2016, 11:18
- - e-serg   Цитата(Allregia @ Feb 11 2016, 00:53) Или...   Feb 11 2016, 02:37
- - ViKo   Попробуйте записывать намного чаще. Наверное, дожд...   Feb 12 2016, 11:41
|- - Ruslan1   Все-таки попробуйте логическим анализатором, подкл...   Feb 12 2016, 12:21
|- - Alechek   Цитата(редактор @ Feb 12 2016, 17:33) тем...   Feb 12 2016, 12:35
|- - Allregia   Цитата(aaarrr @ Feb 22 2016, 20:00) Попро...   Feb 23 2016, 17:58
- - редактор   ЦитатаУвеличить частоту системного времени? Для на...   Feb 15 2016, 08:54
- - Alechek   Проверяется флешка другими средствами : h2testw   Feb 25 2016, 10:12
- - khach   Если на плате есть кроме карnы большая SPI флеш-па...   Feb 25 2016, 11:55
- - Сергей Борщ   Мне кажется aaarrr правильно угадал - 4Гб это огра...   Feb 25 2016, 12:07
|- - khach   Цитата(Сергей Борщ @ Feb 25 2016, 15:07) ...   Feb 25 2016, 13:52
|- - mantech   Цитата(khach @ Feb 25 2016, 16:52) А вот ...   Feb 25 2016, 17:56
- - Allregia   Я даже не сомневаюсь, что проблема не в FatFs а в ...   Feb 25 2016, 20:33
- - alexen   Allregia Если у вас используется пример от ST с фа...   Mar 12 2016, 00:40
- - lleeloo   Есть предположение, что в какой-то части кода есть...   Mar 13 2016, 20:26


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

 


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


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