Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Разрушение FAT (в FatFs)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Allregia
Странно ведет себя один приорчик на 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?!

Ни у кого небыло ничего подобного? Или мож кто чего умного подскажет, как дальше искать?
Ruslan1
Цитата(Allregia @ Feb 10 2016, 17:53) *
Ни у кого небыло ничего подобного? Или мож кто чего умного подскажет, как дальше искать?

0. проанализируйте посекторно что именно испортилось и где (я обычно WinHex пользую)
1. FAT16 или FAT32? А если поменять?
2. SDIO или SPI? А если поменять?
3. Поищите на самом нижнем уровне, то есть то что самописное к железу доступается.
4. Скорость-помехи-качество питания- качество флэшки?
5. Если проблема появляется практически регулярно- посадите логический анализатор и запишите эти самые 10 часов обмена, в параллель можете и какие-то логические сигналы генерировать и писать в качестве реперных точек, сильно помогает при разборках, а меньше 8-каналки сейчас и не найти анализатор.
e-serg
Цитата(Allregia @ Feb 11 2016, 00:53) *
Или мож кто чего умного подскажет, как дальше искать?

1. Limits: "File size: Upto 4G-1 bytes. (by FAT specs.)"
2. f_sync Используете?
Allregia
Цитата(Ruslan1 @ Feb 10 2016, 22:01) *
0. проанализируйте посекторно что именно испортилось и где (я обычно WinHex пользую)
1. FAT16 или FAT32? А если поменять?
2. SDIO или SPI? А если поменять?
3. Поищите на самом нижнем уровне, то есть то что самописное к железу доступается.
4. Скорость-помехи-качество питания- качество флэшки?
5. Если проблема появляется практически регулярно- посадите логический анализатор и запишите эти самые 10 часов обмена, в параллель можете и какие-то логические сигналы генерировать и писать в качестве реперных точек, сильно помогает при разборках, а меньше 8-каналки сейчас и не найти анализатор.


0: ok, посмотрим.
1: Fat32 конечно, фат16 не может быть на 16ГБ носителе (больше 2гб - только фат32)
2: SDIO, 4bit
3: пытаемся.
4: питание от батарейки через LDO, флешки разные пробовали.
5: куда его посадить?

Цитата
1. Limits: "File size: Upto 4G-1 bytes. (by FAT specs.)"
2. f_sync Используете?


1: стрим примерно 1гигабайт/час, пишем файлы по пол часа, т.е. по пол гига. и глюк происходит примерно на 10-12-м файле (5-6 часов записи).
2: нет, смысл?
Цитата
The f_sync function performs the same process as f_close function but the file is left opened and can continue read/write/seek operations to the file. This is suitable for the applications that open files for a long time in write mode, such as data logger. Performing f_sync function of periodic or immediataly after f_write function can minimize the risk of data loss due to a sudden blackout or an unintentional media removal.


но у нас нет ни блекаута ни mеdia removal, хотя попробовать всунуть периодический вызов f_sync можно, попробуем.
mantech
Цитата(Allregia @ Feb 11 2016, 18:59) *
2: SDIO, 4bit


Попробуйте уменьшить частоту клока, было раз подобное, правда через какое-то время писало кашу-малашу... Уменьшил скорость клока - стало нормально, потом плату переразвели, укоротили проводники до разъема - и со старыми клоками стало работать...
Allregia
Цитата(mantech @ Feb 11 2016, 22:00) *
Попробуйте уменьшить частоту клока, было раз подобное, правда через какое-то время писало кашу-малашу... Уменьшил скорость клока - стало нормально, потом плату переразвели, укоротили проводники до разъема - и со старыми клоками стало работать...

Клоки уменьшить попробуем, хотя бы ради эксперимента, но не думаю что это что-то даст - 5 часов-же оно работает!
К тому-же, там от проца до разъема флешки - пол сантиметра, проц в БГА почти под ней стоит.

P.S. Пытаемся понять, что за такое магическое число "5 часов" (ну от 5-ти до 6-ти) - до 4-4.5 часов записи, никогда ничего не происходило, полет нормальный!
Еще более непонятно - между записью файлов делалось umnount, выключение питания флешки, пауза в сотню миллисеунд (данные в это время в ФИФО писались), потом включение питания флешки, f_mount, f_open, f_write.
ЧЕМ через 5 часов, "ЭТО", отличается от самого первого включения - вот что совершенно непонятно!
(вот не помню только ,делали при этом еще и включение/включение самого SDIO порта).
Писать пробовали и на чистую флешку, и на частично забитую всякой ерундой.
Alechek
Цитата(Allregia @ Feb 12 2016, 13:20) *
ЧЕМ через 5 часов, "ЭТО", отличается от самого первого включения - вот что совершенно непонятно!

Магия может пролазить через питание. Какой температурный режим?
Allregia
Цитата(Alechek @ Feb 12 2016, 10:23) *
Магия может пролазить через питание. Какой температурный режим?


Скоп в питании ничего не видит, по температуре проблем нет, тем более что оно сейчас раскрытое без корпуса на столе лежит. Про на довольно низкой частоте работает (32МГц, и когда работал на 168МГц, было тоже самое).

Впору точно шамана с бубном приглашать....
ViKo
Попробуйте записывать намного чаще. Наверное, дождетесь сбоя намного раньше.
Ruslan1
Все-таки попробуйте логическим анализатором, подключив его ко всем линиям SD-карты. Понимаю, что объем данных огромен и главная проблема синхронизироваться с моментом когда произошел сбой, но можно попробовать увидеть разницу в диагамме между участками "работает" и "не работает".
Автоматическое декодирование SPI в байты сам использую (на Saleae logic analyzer), но вот SDIO в данные он вроде бы напрямую не умеет, нужно в интернете посмотреть как (есть какие-то софтовые проекты-примочки к нему дополнительные)


Так удалось выяснить, что именно портится на флешке? статистику результатов набрали?
Например, один и тот же кластер, или один и тот же номер сектора в кластере или та же страница(сектор) таблицы FAT.

Проанализируйте что именно сбивается и попробуйте эту ситуацию детектировать проверками. Скорее всего сбой в FAT, можно хоть раз в пару секунд проверять его целостность.
Кстати, в FAT можно увеличить число копий таблицы FAT на диске, можно их использовать для проверок валидности.
редактор
Цитата
ЧЕМ через 5 часов, "ЭТО", отличается от самого первого включения

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

Увеличить частоту системного времени?
редактор
Цитата
Увеличить частоту системного времени?

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

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

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

Попробуйте на нижнем уровне записать сектор с адресом 4Гб, не перезапишется ли на самом деле нулевой?
Allregia
Цитата(aaarrr @ Feb 22 2016, 20:00) *
Попробуйте на нижнем уровне записать сектор с адресом 4Гб, не перезапишется ли на самом деле нулевой?


Попробую.
Но пока все еще чудесатее - я попробовал 16гб карточку форматнуть в устройстве, средствами FatFs - она ее на 3 гига форматнула!
Я потом на компе с геморроем ее восстановил!
Сама флешка нормальная, не с али sm.gif
Да и проверил я ее, на всякий случай - записал 6 фильмов по полтора гига, все работают.
Alechek
Проверяется флешка другими средствами : h2testw
khach
Если на плате есть кроме карnы большая SPI флеш-память, я быписал туда весь лог вызовов FatFs ил отправлял бы лог на хост. Скорее всего где то переполнение или знаковое- беззнаковое сравнение.
А как портится содержимео фата? Вычитать WinHex порченую катрочку на физическом уровне и посмотреть где и что напорчено.
Сергей Борщ
Мне кажется aaarrr правильно угадал - 4Гб это ограничение 32-битного целого. Где-то на нижнем уровне для адреса использовано 32-битное целое вместо 64-битного, после 4 Гб новые данные затирают таблицу разделов.
khach
Цитата(Сергей Борщ @ Feb 25 2016, 15:07) *
после 4 Гб новые данные затирают таблицу разделов.

Ну это легко проверить, если писать данные с номером сектора внутри. Тольк по идее в MBR, и в копии таблиц фатов оно писать данные не будет, т.к это слишком тривиальная ошибка. Кстати, таблицы ФАТ кешированы ли и сбрасывались ли кеши после записи каждого файла?
А вот если перетерло MBR, то это почти точно не ошибка в FatFS, а в драйвере доступа к карте на уровне железа.
mantech
Цитата(khach @ Feb 25 2016, 16:52) *
А вот если перетерло MBR, то это почти точно не ошибка в FatFS, а в драйвере доступа к карте на уровне железа.


Тоже довольно спорный вопрос, во первых, не видел еще ни одного драйвера карты, где LBA не 32х битное число, а даже, если оно вдруг 24х битное, то все равно проблема должна была быть на 8м гиге, а не на 4м...
Allregia
Я даже не сомневаюсь, что проблема не в FatFs а в драйвере, но он родной от ST, правда старый, 2011-го года, но какая разница, должен же был работать?

По заданным вопросам:
- я проверю флешку h2testw, но на 300% уверен что она не фейковая.
- затирается с 0-го сектора.

К сожеланию нет возможности заниматься этой проблемой все время, только "в фоновом режиме" от более важных задач. Пока используем 4гб карточки, на всякий случай.

Тест показал:
Цитата
Warning: Only 15271 of 15272 MByte tested.
Test finished without errors.
You can now delete the test files *.h2w or verify them again.
Writing speed: 33.9 MByte/s
Reading speed: 57.2 MByte/s
H2testw v1.4
alexen
Allregia
Если у вас используется пример от ST с файлом stm324xg_eval_sdio_sd.c от 30.09.2011, то там ошибка в расчете адреса. Проверьте функции SD_ReadBlock, SD_ReadMultiBlocks, SD_WriteBlock, SD_WriteMultiBlocks. Тоже однажды столкнулся с таким поведением.
lleeloo
Есть предположение, что в какой-то части кода есть место, где проверяется тип карты - HC или обычная SC. В одном из случаев (карта SC) происходит домножение адреса на 512. Если переменная 32 бита, то может происходить переполнение.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.