Developer 0 3 марта, 2020 Опубликовано 3 марта, 2020 · Жалоба Использую FatFS на картах памяти microSDHC. С картами памяти работаю на процессорах Freescale MK24 и NXP i.MX RT1050. Карты используются достаточно интенсивно (запись, чтение, удаление файлов) в нескольких потоках FreeRTOS одновременно. Через некоторое время работы таблица FAT ломается, один раз поймал, что 0-й блок затерт 0xFF. Пробовал убрать весь код, который вносит изменения в файловую систему (запись, удаление) (низкоуровневая функция записи блока на SD точно не вызывается), но со временем FAT все равно разрушается. Помогает только блокировка записи на уровне карты памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 3 марта, 2020 Опубликовано 3 марта, 2020 · Жалоба 8 minutes ago, Developer said: Пробовал убрать весь код, который вносит изменения в файловую систему (запись, удаление) Это делать надо не на уровне файловой системы (вдруг что-нибудь пропустите или просто нарушите логику работы), а в драйвере diskio.c. И закомментировать потребуется одну! функцию. Вопрос: вы эти карты тестировали на ПК? Чтобы исключить/подтвердить проблему с ними? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Developer 0 3 марта, 2020 Опубликовано 3 марта, 2020 · Жалоба Не важно указал ли я дефайн _FS_READONLY в FatFS или выпилил весь код расположенный выше, факт в том, что disk_write не вызывается 13 минут назад, haker_fox сказал: Вопрос: вы эти карты тестировали на ПК? Чтобы исключить/подтвердить проблему с ними? Карты использовались самые разные, начиная NoName и заканчивая классом Industrial. Разные производители, модели, объемы. Но на всех наблюдаются подобные проблемы с развалом FAT. какие-то раньше, какие-то позже, но итог один На ПК подобные тесты не проводились. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 3 марта, 2020 Опубликовано 3 марта, 2020 · Жалоба 13 minutes ago, Developer said: Не важно указал ли я дефайн _FS_READONLY в FatFS или выпилил весь код расположенный выше, факт в том, что disk_write не вызывается Это вам неважно. А нам - отвечающим на вашу проблему, ещё как важно. Любой нюанс может нести капельку полезной информации. Ладно, поехали дальше. А ioctl ничего не делает с флешкой? 13 minutes ago, Developer said: На ПК подобные тесты не проводились. Ну так какой смысл от тестов на вашей железке. Тестировать нужно на ПК, где заранее известно, что драйвер, файловая система, сигналы и всё прочее в порядке. А так как вы сможете узнать источник проблемы? Может быть у вас флешки такие. Дополнительно: проверьте питание карты, подключите туда осциллограф, с настроенным триггером на провал питания и подъём. Также нужно посмотреть на шину данных. Если у вас действительно нет записи, то других причин я пока не вижу. Кстати, какой интерфейс данных вы используете? Я правильно понимаю, что вы в своей железке только читаете карту? Работал с картами. Подобного поведения не наблюдал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Developer 0 3 марта, 2020 Опубликовано 3 марта, 2020 · Жалоба 6 минут назад, haker_fox сказал: Это вам неважно. А нам - отвечающим на вашу проблему, ещё как важно. Любой нюанс может нести капельку полезной информации. Ладно, поехали дальше. А ioctl ничего не делает с флешкой? судя по коду FatFS, disk_ioctl вызывается только при форматировании карты (f_mkfs) и при дампе кэша (sync_fs), обе эти функции закрываются дефайном _FS_READONLY Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 3 марта, 2020 Опубликовано 3 марта, 2020 · Жалоба Ну раз так, я бы первым делом сунул эти карты в комп, и погонял интенсивные тесты. Затем, если карты его пройдут, то проверил бы жезеку с точки зрения аппаратной части: питание, шину данных. Пока больше идей нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Developer 0 3 марта, 2020 Опубликовано 3 марта, 2020 · Жалоба попробую погонять подобные тесты на ПК. По питанию все ровно, осциллографом просадки не ловятся Сигнал шины данных выглядит нормальным. Клоки тоже в норме Проанализировать шину команд не предоставляется возможным, тот анализатор, который есть в наличии не умеет SDIO, чтобы узнать что на самом деле контроллер SDHC отправляет на карту памяти Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 3 марта, 2020 Опубликовано 3 марта, 2020 · Жалоба 9 minutes ago, Developer said: SDHC отправляет на карту памяти А что у вас в качестве микроконтроллера? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 136 3 марта, 2020 Опубликовано 3 марта, 2020 · Жалоба Как организовано разделение карты между потоками? Не работал с SD, но не может получиться так, что при одновременном обращении двух потоков одна команда вклинивается в другую и превращает ее из команды чтения в команду стирания? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 3 марта, 2020 Опубликовано 3 марта, 2020 · Жалоба 14 minutes ago, Сергей Борщ said: вклинивается в другую и превращает ее из команды чтения в команду стирания? Команды защищены CRC7. Вроде бы такого быть не должно. Но, согласен, проверить стоит Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Developer 0 3 марта, 2020 Опубликовано 3 марта, 2020 · Жалоба 27 минут назад, haker_fox сказал: А что у вас в качестве микроконтроллера? я имел в виду SDHC контроллер, которые внутри Freescale MK24 и NXP i.MX RT1050. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Developer 0 3 марта, 2020 Опубликовано 3 марта, 2020 · Жалоба 8 минут назад, haker_fox сказал: Команды защищены CRC7. Вроде бы такого быть не должно. Но, согласен, проверить стоит Забавно, но в драйвере в комплекте KDS никогда не выставляется бит CCCEN в регистре SDHC_XFERTYP Цитата Command CRC Check Enable If this bit is set to 1, the SDHC shall check the CRC field in the response. If an error is detected, it is reported as a Command CRC Error. If this bit is set to 0, the CRC field is not checked. The number of bits checked by the CRC field value changes according to the length of the response. Стоит попробовать добавить. Но даже если в карту пришла команда стирания, не должно заставить контроллер SD стереть блок. Последовательность команд записи/чтения и стирания разные. А вот вместо чтения вполне может прилететь запись. Цитата SDHC_PDD_CMD17_READ_SINGLE_BLOCK 0x11U SDHC_PDD_CMD24_WRITE_BLOCK 0x18U Спасибо Сергею за наводку Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 3 марта, 2020 Опубликовано 3 марта, 2020 · Жалоба 4 minutes ago, Developer said: Забавно, но в драйвере в комплекте KDS никогда не выставляется бит CCCEN в регистре SDHC_XFERTYP Снова не помню уже нюансов, а карте по-барабану, что-ли, на контрольную сумму?! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 136 3 марта, 2020 Опубликовано 3 марта, 2020 · Жалоба 17 минут назад, Developer сказал: А вот вместо чтения вполне может прилететь запись. Разве можно записать 0xFF без стирания? Или эти карты стираются нулями? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 3 марта, 2020 Опубликовано 3 марта, 2020 · Жалоба 3 минуты назад, Сергей Борщ сказал: Разве можно записать 0xFF без стирания? Или эти карты стираются нулями? Всю эту магию делает контроллер карточки прозрачно для пользователя. Наружу торчат команды записи блока. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться