Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: stm32 и FatFs от Chan
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2
Ioann_II
Здравствуйте, Уважаемые коллеги.

Снова нуждаюсь в Ваших подсказках.

Наконец-то подключил файловую систему от Чана и решил её опробовать.
Версия R0.11 от 02-02-2015.
Пробую открыть файл и дописать в его конец данные:
Код
f_open(&MyFile, "stm32.txt", FA_WRITE | FA_OPEN_ALWAYS);
f_lseek(&MyFile, f_size(&MyFile));
f_write(&MyFile, wtext, strlen((char *)wtext), &wbytes);


По описанию, FA_OPEN_ALWAYS должна открывать файл, если он есть и создавать если его нет.
Код выполняется, но:
- если такой файл уже есть, то очень быстро, менее 1с.
- если файла нет, то f_open и f_lseek срабатывают быстро, а вот f_write - долго, примерно минута. файл с данными появляются.

С чем это может быть связано? Куда "копать"?

_FS_NORTC пробовал (время не организовывал).
портирование от Domen Puncer, немного переделал.

Спасибо.
Genadi Zawidowski
три вопроса:
0) почему не последняя версия?
1) почему потребовалось портироваоие а не оригинальный код
2) есть ли работа с DMA в diskio и учтены ли требования по выравниванию структур? Это пришлось делать.
MiklPolikov
Цитата(Ioann_II @ Mar 30 2017, 05:04) *
С чем это может быть связано? Куда "копать"?


Смотреть в Ваши низкоуровневые функции чтения/записи диска, к которым обращается FatFS, и пытаться понять, что в них происходит: либо чтение одного и того что с одной и той же ошибкой, или чтение всего FAT в поисках чего-то и т.п.
Ioann_II
0) почему не последняя версия?
Версия та, что была предложена в CubeMX. Полагаю, надо сначала её запустить, а потом уже и посвежее можно попробовать.
1) почему потребовалось портироваоие а не оригинальный код
Имею в виду под портированием реализацию низкоуровневых функций. Несколько разных вариантов из интернета пробовал - всё вообще тупо висло.
Поэтому (т.к. "с наскока" не вышло), стал разбираться последовательно. Чтение и запись секторов работают нормально, проверено. Регистр CSD тоже, из него берутся нужные параметры для ioctl. Таймауты сделаны без таймеров.
2) есть ли работа с DMA в diskio и учтены ли требования по выравниванию структур? Это пришлось делать.
DMA нет. Структур (кроме тех, которые в самой FatFs) не использую.

Ещё. Несколько дней назад на этот-же МК портировал систему FAT32. Там таких проблем не выявлено....
Да, ещё вот - на карте уже записано с пяток файлов, общим объёмом 80Мб.

Сейчас попробовал почистить карту - стало всё быстро....

Получается, что если карта заполнена, то новый файл будет создаваться очень долго??
MiklPolikov
Цитата(Ioann_II @ Mar 31 2017, 02:57) *
Получается, что если карта заполнена, то новый файл будет создаваться очень долго??

Если на карте тысячи файлов, то возникают задержки в секунды.
У Вас кривое "портирование", низкоуровневые функции работы с диском нужно отлаживать либо писать заново.

Порядок действий при отладке такой:
1) Низкоуровневые функции запускаются сами по себе, без FATFS, измеряется их скорость работы.
2) В низкоуровневых функциях раскидываются команды дёргания ногой процессора, сигнал снимается осциллоскопом, таким образом выявляются места, где функция тормозит.
3) То же самое, что в п 2, но с FATFS
4) Читается моя тема про скорость работы карт памяти, https://electronix.ru/forum/index.php?showt...;hl=MiklPolikov , делаются выводы, низкоуровневые функции и fATfs перенастратваются, п 1-3 проходятся заново.
5) Принимается решение избавится от интерфейса SPI( я угадал ? ) и перейти на SDIO
6)П 1-4 проходятся заново
jcxz
Цитата(Ioann_II @ Mar 31 2017, 01:57) *
Получается, что если карта заполнена, то новый файл будет создаваться очень долго??

Нет, это только означает что у Вас неправильные пчёлы кривой код.
Да вроде в той сборке FatFS, что когда скачивал уже были примеры портирования под разные МК. Наверняка там было и для STM32. Сам не пробовал ибо сразу написал свой low level diskio.
Ioann_II
Цитата(MiklPolikov @ Mar 31 2017, 09:31) *
Если на карте тысячи файлов, то возникают задержки в секунды.
У Вас кривое "портирование", низкоуровневые функции работы с диском нужно отлаживать либо писать заново.

Порядок действий при отладке такой:
1) Низкоуровневые функции запускаются сами по себе, без FATFS, измеряется их скорость работы.
2) В низкоуровневых функциях раскидываются команды дёргания ногой процессора, сигнал снимается осциллоскопом, таким образом выявляются места, где функция тормозит.
3) То же самое, что в п 2, но с FATFS
4) Читается моя тема про скорость работы карт памяти, https://electronix.ru/forum/index.php?showt...;hl=MiklPolikov , делаются выводы, низкоуровневые функции и fATfs перенастратваются, п 1-3 проходятся заново.
5) Принимается решение избавится от интерфейса SPI( я угадал ? ) и перейти на SDIO
6)П 1-4 проходятся заново


1. Файлов всего 5-6. Общий объём 80МБ.
2. Низкоуровневые функции писаны заново. Чтение и запись сектора - проблем не выявлено. Поскольку при малом использовании объёма карты операции проходят быстро, дело не в этих функциях. Похоже, что долго делается поиск свободных кластеров...
3. Дёргания ногой процессора нет - используется аппаратный интерфейс SPI. Кстати надо проверить, не забыл-ли я в этом проекте поднять скорость SPI после инициализации карты. Хотя это не принципиально.
4. За ссылку спасибо - буду изучать.
5. Не угадали. SDIO на МК нет, поэтому только SPI.... увы. С SDIO, наверное, проще - в CUBEMX есть поддержка его и в проект подключается просто.

Вопрос - как Чан ищет кластер свободный для создания файлов - если тупо перебирает все имеющиеся кластеры, тогда это долгий процесс... и тем более долгий, чем больши кластеров занято...
jcxz
Цитата(Ioann_II @ Mar 31 2017, 09:41) *
Вопрос - как Чан ищет кластер свободный для создания файлов - если тупо перебирает все имеющиеся кластеры, тогда это долгий процесс... и тем более долгий, чем больши кластеров занято...

Если подозреваете что дело именно в этом - попробуйте отформатировать карту заново и с большим размером кластера и положить туда потом эти файлы.
И вроде там у Чана был кеш FAT-области. А если нет - его можно сделать. Там насколько помнится можно было выделить сколько-то памяти под буфер, можно было минимум, а можно было побольше. Может из-за нехватки буфера у Вас ПО постоянно перечитывает FAT и запись директории с карты?
Если Вы сами пишете low level IO, то несложно туда добавить печать в лог статистики вызовов - можете промониторить какие функции вызываются, насколько часто и каковы временные соотношения между этими вызовами.

Я пару лет назад использовал FatFS на LPC1788. И тоже через SPI. Писал сам низкий уровень (SSP с FIFO + DMA + достаточные буфера в ОЗУ). Так у меня скорость чтения приближалась к 1МБ/сек. Открытия/закрытия файлов тоже не тормозили.
Посмотрите всё что касается буферизации в FatFS и добавьте везде.
Ioann_II
Цитата(jcxz @ Mar 31 2017, 12:02) *
Если подозреваете что дело именно в этом - попробуйте отформатировать карту заново и с большим размером кластера и положить туда потом эти файлы.
И вроде там у Чана был кеш FAT-области. А если нет - его можно сделать. Там насколько помнится можно было выделить сколько-то памяти под буфер, можно было минимум, а можно было побольше. Может из-за нехватки буфера у Вас ПО постоянно перечитывает FAT и запись директории с карты?
Если Вы сами пишете low level IO, то несложно туда добавить печать в лог статистики вызовов - можете промониторить какие функции вызываются, насколько часто и каковы временные соотношения между этими вызовами.

Я пару лет назад использовал FatFS на LPC1788. И тоже через SPI. Писал сам низкий уровень (SSP с FIFO + DMA + достаточные буфера в ОЗУ). Так у меня скорость чтения приближалась к 1МБ/сек. Открытия/закрытия файлов тоже не тормозили.
Посмотрите всё что касается буферизации в FatFS и добавьте везде.

Форматировать с другим размером кластера - попробую, должно помочь, но не решит кардинально ситуацию. Сейчас 80Мб занято, карта на 8ГБ, а если будет под завязку?... тогда как???

По этому пути (буферизации) тоже думаю идти, но пока что с другой реализацией FAT32, не от Чана. Идея от CC Dharmani, Chennai, переделанная сначала kontroler (http://forum.easyelectronics.ru/viewtopic.php?f=4&t=2460), затем мной... всё просто и прозрачно, но нет работы с каталогами, поддержки длинных имён и кодовых страниц.
Но с буферизацией не так всё гладко - мне надо, чтобы была поддержка "горячего" подключения карты (т.е. карту могут вынуть и вставить почти в любой момент времени). Поэтому думаю номер последнего задействованного кластера писать на карту, в зарезервированной области boot сектора. Чтобы тогда не перебирать все кластеры, которые уже заняты данными.

Именно поэтому и задал вопрос по FatFs от Чана - полагаю, что кто-то с этим уже сталкивался, решал и что-то может подсказать.

Цитата(jcxz @ Mar 31 2017, 09:37) *
Нет, это только означает что у Вас неправильные пчёлы кривой код.
Да вроде в той сборке FatFS, что когда скачивал уже были примеры портирования под разные МК. Наверняка там было и для STM32. Сам не пробовал ибо сразу написал свой low level diskio.

Для уважаемого jcxz:
Может, конечно и "кривой" код... Мой код (точнее, не совсем мой, а переделанный из интернета) - только чтение и запись сектора, а также получение служебных данных (ioctl) и инициализация. Вот код: - покажете что тут криво? (вложение).

Пробовал несколько разных чужих примеров - ничего не "завелось". Все примеры "тупо висли". Это "завёл".
MiklPolikov
Цитата(Ioann_II @ Mar 31 2017, 10:41) *
Похоже, что долго делается поиск свободных кластеров...

вот-вот. Ищите где тормозит по тому алгоритму, что я описал. Без долгой скрупулёзной самостоятельной отладки, увы, не обойтись.
Время работы функций измеряется не в "достаточно быстро", а в микросекундах. Надо измерять.

Цитата
5. Не угадали. SDIO на МК нет, поэтому только SPI.... увы.

Угадал. У Вас SPI.

Отписываюсь от темы.
Ioann_II
Цитата(MiklPolikov @ Mar 31 2017, 15:23) *
вот-вот. Ищите где тормозит по тому алгоритму, что я описал. Без долгой скрупулёзной самостоятельной отладки, увы, не обойтись.
Время работы функций измеряется не в "достаточно быстро", а в микросекундах. Надо измерять.


Угадал. У Вас SPI.

Отписываюсь от темы.

Буду искать, о результатах отпишусь. Также придётся разбираться "в дебрях" реализации FatFs....
С надобностью измерять согласен полностью, но только касательно низкоуровневых функций, т.к. время работы функций файловой системы сильно будет зависеть от содержимого диска - как в моём случае.

Да, в этом проекте всё-же забыл сделать переключение на максимальную частоту SPIпосле инициализации - стало работать быстро.
Заполню карту и проверю ещё раз. И попытаюсь время измерить.

Не угадали по решению избавиться от SPI - надеюсь, не обидел....

Сделал переключение на максимальную частоту SPI. И измерение времени:
При наличии файла:
open - 38мс
lseek - 387мс
write - 843мс (пишется 1000раз по 82 байта)
При отсутствии файла (создание)
open - 182мс
lseek - 0
write - 4531мс

Т.е. open почти в 5 раз! и write почти в 12раз!
Genadi Zawidowski
Цитата
Таймауты сделаны без таймеров.

Это где? Там же все по статусу карты делается...
Если что - мой вариант велосипеда. В файле sdcard.c вариант для SPI начинается со строки 2350.
Шаманъ
Цитата(Ioann_II @ Mar 31 2017, 17:15) *
При наличии файла:
open - 38мс
lseek - 387мс
write - 843мс (пишется 1000раз по 82 байта)
При отсутствии файла (создание)
open - 182мс
lseek - 0
write - 4531мс

Т.е. open почти в 5 раз! и write почти в 12раз!

По 82 байта писать не есть хорошо. Я бы писал хотя бы кратно секторам, организовав небольшой буфер.
Rash
Потеря скорости и времени будет, если писать по 82 байта. Скорость можно достичь если кратно секторам и то хотя бы начиная с 1024, а то и лучше 4096 байт, складывая нужные данные в свои буферы. Также есть задержка после записи/чтения данных. Задержка завесит от размера передаваемых данных. Для записи может длится 1-30 мсек. Причём самая длительная имеет одну и туже периодичность, скорее всего зависит при переходе между блоками.

Думал сделать буфер на низком уровне, но не получилось, т.к. есть перекрёстный вызов из FatFs функций Write и Read. Выход, вставить переключение задач пока идёт ожидание, что бы не терять время при частой записи на SD карту.
Ioann_II
Отформатировал карту.
Записал большой объём данных (мегабайт на 300).
Проверил ещё раз:
открытие - 185 мс
поиск конца файла - 0 мс
запись данных 10*82 байт - 81 мс.

Вывод: похоже, что FatFs от Чана тут не при чём... До этого на этой карте тестировал другую FAT32 - Похоже, что там что-то не так. А тут всё норм.

Про 82 байта - это для тестирования так. Запись строки. Понятно, что для файловой системы лучше всего, когда пишется кратно сектору, но это не всегда так.
В частности, мне надо именно 82 байта за каждый раз.

Но всё равно хорошо, что спросил - получил полезную информацию, советы и ссылки.
jcxz
Цитата(Ioann_II @ Apr 1 2017, 12:21) *
Вывод: похоже, что FatFs от Чана тут не при чём... До этого на этой карте тестировал другую FAT32 - Похоже, что там что-то не так. А тут всё норм.

Ещё вроде желательно, чтобы все структуры (начала копий FAT, бутзапись, корневой каталог) были выровнены по границе блока стирания карты. Тогда вроде операции записи выполняются значительно быстрее. Размер блока стирания указан в CSD.
Может на той проблемной карте было невыровнено.
Ioann_II
Цитата(jcxz @ Apr 1 2017, 16:23) *
Ещё вроде желательно, чтобы все структуры (начала копий FAT, бутзапись, корневой каталог) были выровнены по границе блока стирания карты. Тогда вроде операции записи выполняются значительно быстрее. Размер блока стирания указан в CSD.
Может на той проблемной карте было невыровнено.

Проверить теперь сложнее - карту уже отформатировал.... Но поковыряю FAT32, ту, что упоминал ранее, возможно найду причину... тогда напишу.
На этой карте читал регистр CSD - так кратность стирания там 1 байт (они называют это granularity).
Hold
На обычной SD 2 ГБ емкостью получал скорости записи 3.7 МБ/с, чтения 7.3 МБ/с. STM32F429, SDIO 4бит, DMA(тупое ожидание окончания записи), FatFs_R0.13. Писал файл размером 32 МБ из SDRAM и читал его же в SDRAM. Хочется большой скорости - нужно писать большими блоками, можно собирать предварительно в буфер в SDRAM, затем скопом писать. Если писать теже самые 32МБ но блоками по 512 байт, то скорость записи всего около 200КБ/с, на порядок меньше. Возможно не оптимальный драйвер, да и надо найти карточку SDHC классом повыше попроверять.
Цитата
17/10/12 14:55:34->[EXT MEM: SDCARD]->Write end, speed: 3889 KB/s ( 33 554 432 (32.00 MB) in 8424 ms)
17/10/12 14:55:34->[EXT MEM: SDCARD]->Read end, speed: 7534 KB/s ( 33 554 432 (32.00 MB) in 4349 ms)
mantech
Цитата(Hold @ Oct 12 2017, 10:10) *
Если писать теже самые 32МБ но блоками по 512 байт, то скорость записи всего около 200КБ/с, на порядок меньше. Возможно не оптимальный драйвер, да и надо найти карточку SDHC классом повыше попроверять.


Это не проблема ФС, а карты памяти, ибо флеш не оптимизирован за запись мелкими кусками(менее 4К).
Hold
Нашел карту SDHC 4 класс 8 ГБ. Или что-то с картой не так, или с драйвером:
Цитата
17/10/13 11:36:04->[EXT MEM: SDCARD]->Free: 7 833 767 936 (7.29 GB)
17/10/13 11:36:04->[EXT MEM: SDCARD]->Total: 7 846 363 136 (7.30 GB)
17/10/13 11:36:13->[EXT MEM: SDCARD]->Write end, speed: 557 KB/s ( 4 194 304 (4.00 MB) in 7345 ms)
17/10/13 11:36:13->[EXT MEM: SDCARD]->Read end, speed: 5165 KB/s ( 4 194 304 (4.00 MB) in 793 ms)

Читает/пишет без ошибок, однако скорость никуда не годится. На ПК показывает 4 МБ/с Надо поискать 10-й класс.
Огурцов
Цитата(mantech @ Oct 12 2017, 12:05) *
Это не проблема ФС, а карты памяти, ибо флеш не оптимизирован за запись мелкими кусками(менее 4К).

а там (в либе) ограничение на 512 может быть, так что (в некоторых случаях) никак
mantech
Цитата(Огурцов @ Oct 13 2017, 08:35) *
а там (в либе) ограничение на 512 может быть, так что (в некоторых случаях) никак


Дак ведь в настройках фатфса все прекрасно правиться laughing.gif
Ruslan1
Цитата(Hold @ Oct 13 2017, 06:46) *
Читает/пишет без ошибок, однако скорость никуда не годится. На ПК показывает 4 МБ/с Надо поискать 10-й класс.

Это не столько от класса карточки зависит, сколько от организации программы и от организации карточки.
Попробуйте разобраться, на что именно у Вас тратится основное время, например, при file append:
1) поиск первого кластера файла в FAT
2) прохождение по цепочке кластеров до последнего
3) чтение нужного сектора
3а) поиск свободного кластера (если нужен)
4) обновление сектора
5) запись сектора обратно
6) обновление FAT и всех копий FAT (изменение длины файла, добавка кластера в цепочку если нужно)

Только (5) и (6) от класса карточки и зависят, остальное- от быстродействия программы и расположения файла на карточке.

Тут гораздо больше чтения, чем записи. И очень часто этот бесконечный поиск-обновление FAT занимает много времени.
Я в критичной к времени записи задаче (запись кольцевого файла кэша определенной длины) делал при старте поиск цепочки кластеров нужной длины, объявлял их занятыми файлом, и далее напрямую пихал туда данные. Было значительно быстрее чем на каждый 200-байтовый чих проходить полную стандартную цепочку с поиском в FAT.

В общем случае помогает укорочение цепочки в FAT (использование длинного кластера), нахождение файла в начале карточки (первые кластеры) и несегментированность карточки (кластеры файла следуют друг за другом). Ну и расположение файлов в корневой директории, чтобы цепочка поиска была короче.
Hold
Да, дело было в размере кластера. Флешку не форматнул, проверял как есть. В итоге кластер был всего лишь 4КБ. Поставил кластер 64КБ, скорость выросла:
Цитата
17/10/13 16:01:15->[EXT MEM: SDCARD]->Write end, speed: 3700 KB/s ( 33 554 432 (32.00 MB) in 8856 ms)
17/10/13 16:01:15->[EXT MEM: SDCARD]->Read end, speed: 7824 KB/s ( 33 554 432 (32.00 MB) in 4188 ms)

Понятно что с таким размером кластера, невыгодно хранить много мелких файлов, т.к. зарезервируется слишком много пустого места.
Для сравнения взял обычную SD на 2 гб, кластер также 64 КБ
Цитата
17/10/13 16:03:52->[EXT MEM: SDCARD]->Write end, speed: 3666 KB/s ( 33 554 432 (32.00 MB) in 8937 ms)
17/10/13 16:03:52->[EXT MEM: SDCARD]->Read end, speed: 7814 KB/s ( 33 554 432 (32.00 MB) in 4193 ms)

Нашлась карта SDXC на 64 Гб, 10 класс. Кластер также выставил в 64 кбайта, стоит exFAT. Скорость уже куда интереснее:
Цитата
17/10/13 16:11:20->[EXT MEM: SDCARD]->Free: 63 830 753 280 (59.44 GB)
17/10/13 16:11:20->[EXT MEM: SDCARD]->Total: 63 831 015 424 (59.44 GB)
17/10/13 16:11:27->[EXT MEM: SDCARD]->Write end, speed: 7063 KB/s ( 33 554 432 (32.00 MB) in 4639 ms)
17/10/13 16:11:27->[EXT MEM: SDCARD]->Read end, speed: 7813 KB/s ( 33 554 432 (32.00 MB) in 4194 ms)
Ruslan1
Цитата(Hold @ Oct 13 2017, 11:19) *
Понятно что с таким размером кластера, невыгодно хранить много мелких файлов, т.к. зарезервируется слишком много пустого места.

Думаете что-то сэкономить, взяв маленькую, но быструю SD-карточку? И не надейтесь. Сейчас уже не могу по нормальной цене найти Сандиск 10-й класс 8GB, только 16GB. Хотя еще прошлой зимой весь ебей был ими завален, но зато тогда уже закончились 4GB.
Так что или нужно оптимизироваться под низкоскоростные, либо не думать об объеме.

Кстати, у меня из нескольких сотен SD карточек (Сандиск), после агрессивной нон-стоп работы в течении нескольких лет уже штук 8 стали в странную позу (не битые сектора, а что-то в электронике- работают только первые пару секунд и отваливаются). Вот думаю, может потому что 10-й класс и нужно что-то низкоскоростное и более дубовое брать... Проблема в том, что пока удостоверюсь в их надежности (через годик-два), их уже перестанут выпускать.
Hold
У меня интерес по поводу скорости был скорее академический, да и скорости мне такие не нужны. Флешка нужна лишь в качестве логгера, объемы данных смешные, запись редкая. Отлаживал драйвер SDIO (DMA + выравнивание и прочие грабли), прикручивал к FatFs, решил глянуть а сколько вообще скорости можно достить (мало ли, вдруг задача будет).
Ruslan1
Цитата(Hold @ Oct 13 2017, 11:51) *
решил глянуть а сколько вообще скорости можно достить (мало ли, вдруг задача будет).

Проблема эту достигнутую скорость удержать.
Попробуйте повторить опыт в наиболее плохом режиме, возможном во время эксплуатации (кластер не меняется, меняется только содержимое карточки):
1) карточка почти полностью забита- то есть нужно дописывать в последние, например, 10% карточки
2) файлы сильно сегментированы и FAT целиком не вмещается в буфер RAM
3) файл "засунут" в глубину структуры папок, а не в лежит в корне диска.

Вложенные папки- это вообще важный момент для оптимизации времени доступа. Я как-то видел серьезные тормоза из-за непонимания программистом работы FAT - удалялись устаревшие файлы из сабдиректориев, но зато не удалялись сами директории. И бедный МК бегал по всей вложенной структуре из сотен пустых папок, чтобы дойти до последней, в которой таки и был актуальный требующий обновления файл.
mantech
Цитата(Ruslan1 @ Oct 13 2017, 13:14) *
вложенной структуре из сотен пустых папок, чтобы дойти до последней, в которой таки и был актуальный требующий обновления файл.


Жесть какая-то crying.gif
jcxz
Цитата(Ruslan1 @ Oct 13 2017, 11:20) *
В общем случае помогает укорочение цепочки в FAT (использование длинного кластера), нахождение файла в начале карточки (первые кластеры) и несегментированность карточки (кластеры файла следуют друг за другом). Ну и расположение файлов в корневой директории, чтобы цепочка поиска была короче.

У автора, судя из письма, имеется SDRAM. Простое и очевидное решение в этом случае - кеширование по чтению. Тогда описанные Вами проблемы минимизируются.
Кеширование на уровне ниже FatFS.
Огурцов
Цитата(mantech @ Oct 13 2017, 08:43) *
Дак ведь в настройках фатфса все прекрасно правиться laughing.gif

предполагается, что чен чем-то думал
а вообще, соглашусь - стоит просто проверить
Hold
Цитата(jcxz @ Oct 13 2017, 22:51) *
У автора, судя из письма, имеется SDRAM. Простое и очевидное решение в этом случае - кеширование по чтению. Тогда описанные Вами проблемы минимизируются.
Кеширование на уровне ниже FatFS.

SDRAM не бесконечна, 64 Мбайта на всё. Там и так крутится кэш(зеркало на чтение) AT45DB641 и нескольких FM25V10, память GUI, куча lwIP и виртуальный диск в FatFs (помимо карточки). Как именно логичнее сделать кэш на чтение с карточки? В случае с небольшой AT45, достаточно хранить полную копию, для максимально быстрого чтения, а вот с задачей кэширования карточки не сталкивался.
Ruslan1
Цитата(Hold @ Oct 16 2017, 11:37) *
Как именно логичнее сделать кэш на чтение с карточки? В случае с небольшой AT45, достаточно хранить полную копию, для максимально быстрого чтения, а вот с задачей кэширования карточки не сталкивался.

Минимум- это копия таблицы FAT. Оптимум- еще и кэш читаемого кластера целиком (а не сектора).
Ну и следующий шаг, что еще кэшировать- зависит от задачи.

Еще подумайте про индексирование- однажды проводится при включении, и очень ускоряет доступ по чтению, то есть у Вас уже есть найденные адреса для быстрого доступа к необходимым данным на диске). Но это уже нужно смотреть конкретную задачу.

Кстати, для AT45 я просто кэшировал в его же второй внутренний буфер RAM, там их два, и использовал их по очереди. Это уже сильно ускоряло процесс доступа.
jcxz
Цитата(Hold @ Oct 16 2017, 12:37) *
Как именно логичнее сделать кэш на чтение с карточки?

Стандартно: если при чтении сектор есть в кеше - обновляем его время последнего доступа; если нет (кеш-промах) - читаем с карты и копируем в кеш, присваивая текущее время; при записи также копируем в кеш, обновляя время. При копировании в кеш, если в нём нет свободных мест, удаляем из кеша наиболее старый сектор.
Пары мегабайт думаю вполне хватит (по минимуму).

Цитата(Ruslan1 @ Oct 16 2017, 13:00) *
Кстати, для AT45 я просто кэшировал в его же второй внутренний буфер RAM, там их два, и использовал их по очереди. Это уже сильно ускоряло процесс доступа.

Это не кеширование, это стандартный метод доступа к AT45, предусмотренный её интерфейсом.
Hold
На будущее запомню, однако не думаю что сейчас с наскоку решу эту задачку, надо лезть в дебри FatFs, не на один день вдумчивого ковыряния библиотеки. В случае с AT45 я читаю её лишь при включении, всё дальнейшее чтение идёт с кэша в SDRAM, там несложно. Хотя она и так относительно быстро читается, порядка 4 МБ/с при 45мгц клока.
mantech
Цитата(Hold @ Oct 16 2017, 12:37) *
Там и так крутится кэш(зеркало на чтение) AT45DB641 и нескольких FM25V10,


Если не секрет, зачем эти все ПЗУшки, если есть СД-карта???
sadat
Цитата(mantech @ Oct 16 2017, 16:13) *
Если не секрет, зачем эти все ПЗУшки, если есть СД-карта???

У ФМ-ки почти бесконечное количество циклов записи...
mantech
Цитата(sadat @ Oct 16 2017, 18:08) *
У ФМ-ки почти бесконечное количество циклов записи...

А AT45DB641??
Если уж такое дело, то у СД-рама еще больше, если устойство батарейное или есть возможность подключить к ИБП - то никаких доп. ПЗУшек не надо вообще.
Огурцов
Цитата(mantech @ Oct 16 2017, 13:13) *
Если не секрет, зачем эти все ПЗУшки, если есть СД-карта???

в нашем деле самое главное - контакт
mantech
Цитата(Огурцов @ Oct 16 2017, 18:36) *
в нашем деле самое главное - контакт

Хотите сказать, что нельзя поставить надежный холдер?? Или в устройстве вообще нет ни одного разъема? По-моему - бред laughing.gif
Hold
На FM25V10 в количестве 4х штук лежит критически важная инфа. Ее повреждение, либо ошибка, равносильно полной неработоспособности аппарата. Ресурс дичайший, если постоянно по кругу писать на максимальной скорости, то порядка 20 или 40 лет(не вспомню сейчас). Питание +3.3 зарезервировано ltc3226+lowESR ионистор типа HS230F. На AT45 часть размечена под ежедневные бэкапы всей FRAM памяти, другая часть под различные настройки, третья под образ текущей прошивки и заводской прошивки, гарантировано рабочей. Оставщаяся часть диск FatFs, который доступен через FTP, на нем лежат последние логи, которые пишутся по кругу, по своей сути -черный ящик, на случай отказа. На SD карту пишутся теже самые логи, с нее возможно обновление ПО( а также по сети со странички, либо через FTP), лежат тяжеловесные файлы. Если карта накроетмя, то логов на AT45 хватит на 2-3 суток, за это время сервис мен успеет поменять карту. Если не успевает, то логи пишутся в виртуалтный диск в SDRAM в 32 мбайта. Может показаться избыточно, поначалу всё было куда проще и понятнее.
mantech
Цитата(Hold @ Oct 16 2017, 20:56) *
На FM25V10 в количестве 4х штук лежит критически важная инфа. Ее повреждение, либо ошибка, равносильно полной неработоспособности аппарата.
На AT45 часть размечена под ежедневные бэкапы всей FRAM памяти, другая часть под различные настройки, третья под образ текущей прошивки и заводской прошивки, гарантировано рабочей.
На SD карту пишутся теже самые логи, с нее возможно обновление ПО( а также по сети со странички, либо через FTP), лежат тяжеловесные файлы.
Если не успевает, то логи пишутся в виртуалтный диск в SDRAM в 32 мбайта. Может показаться избыточно, поначалу всё было куда проще и понятнее.


Избыточно?? Это мягко сказано, практически четверное резервирование, это разве, что в космос или в "черный ящик" устанавливать. Только какой резерв, что программа не глюканет - неизвестно...

ЗЫ. Основной лог - на Ф-раме, резервный и с доступом из вне - на СД-карте, буфер в СДРАМ, думаю, этого больше, чем нужно.
Hold
Лог на sdram особо не в счет - питания нет 3 секунды, ионистор отрубаетмя, и лога тоже нет. А так вполне себе мажоритирование 2 из 3. Бывает и 4 из 5). На фраме не лог, а основная инфа, а логи-все действия извне, чтобы в случае отказа повторить/смоделировать ситуацию и внести правки. Потерять их очень нежелательно. Программа, конечно, может глюкпнуть, вон ракеты падают. Дтскутировать о методах оценки надежности ПО можно долго.
mantech
Цитата(Hold @ Oct 16 2017, 21:36) *
Лог на sdram особо не в счет - питания нет 3 секунды, ионистор отрубаетмя, и лога тоже нет. А так вполне себе мажоритирование 2 из 3. Бывает и 4 из 5). На фраме не лог, а основная инфа,


Опять-же не понятно, что такое "основная инфа", это то, что задано в конфигурации или эта инфа создается в процессе работы устр-ва? Если первое - то логичнее эту инфу держать на СДшке, если второе - то это то же самое, что и лог.

Из своего опыта - сделана куча автоматов с логом на единственную СД-карту - из сотни один, макс. 2 отказа и то, по причине банальной жадности, рекомендовали ставить "кингстон", а клиенты решили сэкономить и поставили "смартбай" или еще что-то.
В охранках дублирование на 24хх серии i2c епромах - ни одного отказа, даже на г..но картах.
Огурцов
Цитата(mantech @ Oct 16 2017, 16:38) *
Хотите сказать, что нельзя поставить надежный холдер??

любой самый пренадёжный холдер рано или поздно закиснет, гораздо раньше, чем закиснет пайка
так что в обычном режиме пишем на карточку, в аварийном - на плату
или одновременно, если пенсия не далеко
Hold
Цитата(mantech @ Oct 17 2017, 03:23) *
Опять-же не понятно, что такое "основная инфа", это то, что задано в конфигурации или эта инфа создается в процессе работы устр-ва? Если первое - то логичнее эту инфу держать на СДшке, если второе - то это то же самое, что и лог.

Из своего опыта - сделана куча автоматов с логом на единственную СД-карту - из сотни один, макс. 2 отказа и то, по причине банальной жадности, рекомендовали ставить "кингстон", а клиенты решили сэкономить и поставили "смартбай" или еще что-то.
В охранках дублирование на 24хх серии i2c епромах - ни одного отказа, даже на г..но картах.

Основная инфа - данные, которые создаются в процессе работы, проходят сквозь аппарат. За день может пройти до 3-4 Гб. Флеш бы может выдержал какое-то время, но рано или поздно начнутся ошибки.
mantech
Цитата(Hold @ Oct 17 2017, 06:58) *
За день может пройти до 3-4 Гб. Флеш бы может выдержал какое-то время, но рано или поздно начнутся ошибки.


И все эти гигабайты каждый день должны скидываться на сд-карту, или только какой-то маленький "кусочек"??
Если первое - тут уж что-то надо на подобии SSD диска подключать..
jcxz
Цитата(Hold @ Oct 17 2017, 06:58) *
Основная инфа - данные, которые создаются в процессе работы, проходят сквозь аппарат. За день может пройти до 3-4 Гб. Флеш бы может выдержал какое-то время, но рано или поздно начнутся ошибки.

А какова природа этих данных? Что это? Для чего нужно столько гиг? Просто интересно....
И если действительно нужно по несколько гиг в день, то может реально лучше использовать SSD или HDD?
Hold
Цитата(jcxz @ Oct 17 2017, 15:45) *
А какова природа этих данных? Что это? Для чего нужно столько гиг? Просто интересно....
И если действительно нужно по несколько гиг в день, то может реально лучше использовать SSD или HDD?

Фрам всего 512К, однако обновляться они могут по сотне и более раз на дню. На карту эти данные ВООБЩЕ не скидываются, только логи внешних воздействий.
Чтобы представить аналогию:
Загоняете машину в сервис. В лог пишется заказ-наряд - Иванов И.И. такого то числа, в такое то время загнал свой пепелац, с жалобами, что в машине что-то стучит, назад не едет, и не включается радио Радонеж. Мастер приемщий такой-то и прочая сопуствующая инфа, типа погода нелетная, слоны идут на север.
Передают машину сервис-менам, и они уже детально пишут во FRAM - заменя ремня ГРМ, роликов натяжителя, регулировки такие-то, замена радиоприемника и еще сотня другая различных технчиеских штук, которые полностью и детально описывают что делают и происходит, включая видео-запись всего процесса ремонта, хотя самому Иванову на это пофиг, ему важно знать когда забрать и сколько заплатить.
А теперь представим что таких Ивановых в день приходит пара тысяч, вместимость автосервиса(FRAM) десять тысяч и не все Ивановы сразу забирают авто, а некоторые так вообще забывают, и висят они во FRAM мертвым грузом, пока эвакуатор не увезет на штрафстоянку.
Затем в сервисе отключается свет, ИБП отрубается, и когда включается, оказывается что не все менеджеры успели сохранить открытый заказ наряд(лог), сервисмены сделали часть работ, но не успели внести изменения в сервис-лист(FRAM).
Под вечер приходит Иванов, забирать своё авто, а ему не могут внятно сказать что сделали, что не успели, и где вообще его авто, т.к. не успела сохраниться позиция рабочей станции. Иванов грустит, затем злится, и звонит руководителю, а тот нам, мол почему такая херня.
Иванову#2 повезло больше, свет не отрубался, менеджеры выставили счет, на основе реально проведенного списка работ (FRAM), закрыли заказ наряд (лог), однако тот отчего-то топчет ножкой и возмущается "чойтадорога". Ему на фирменном бланке с печатями и подписями выкладывают детальную секундно/поминутную отчетность по работам(FRAM), видео на котором чумазые работяги снимали колесо вместо 1 часа все 4, т.к. Иванов#2 не дал секретку. Иванов не верит, просит показать видео с другой камеры, и показания свидетелей (резервная копия FRAM). И такую информацию ему предоставляют. Иванов возмущается, но платит, т.к. против фактов не попрешь.
В какой-то момент менеджеры начинают думать - а давайте сделаем историю обслуживания каждого авто (вспоминаем про проходимость в количественных значениях). Директор, пожимая плечами говорит - а чего нет, вон вам комната(СД карта), делайте картотеку. Менеджеры радостно начинают таскать туда всю инфу об авто (вспоминаем про максимальную детализацию, включая видео). Приходится нанимать еще столько же менеджеров просто на доставку всей кипы бумаг, да и комната стремительно заполняется. Когда комната заполняется, приходится всю старую инфу просто выкидывать. Директор говорит - нафиг такое счастье, вся станция только и делает что таскает бумаги, храните только текущую инфу с рабочей станции, а при поступлении нового авто затирайте поверх.
В это время ген-дир всей сети, попивая кофеек на карибах, решает глянуть, как там дела в одном из его отделений. Заходит на страничку (FTP/HTTP), смотрит краткую инфу(логи), т.к. он не отличит карбюратор от кардана и дальше довольно нежится на лазурном бережке.
P.S. Прошу прощения за стиль, у дочки день рожденья)
sadat
Цитата(Hold @ Oct 17 2017, 12:58) *
Фрам всего 512К, однако обновляться они могут по сотне и более раз на дню. На карту эти данные ВООБЩЕ не скидываются, только логи внешних воздействий.
****

Чем мне нравятся мозги программистов - тем, что могут использовать аллегорию применимо к текущему процессу.
jcxz
Цитата(Hold @ Oct 17 2017, 12:58) *
В это время ген-дир всей сети, попивая кофеек на карибах, решает глянуть, как там дела в одном из его отделений. Заходит на страничку (FTP/HTTP), смотрит краткую инфу(логи), т.к. он не отличит карбюратор от кардана и дальше довольно нежится на лазурном бережке.

Всё описанное - это функции компа (сервера) этой СТО. И решается очень просто. Причём тут ваше устройство? Или вы такой сервер пытаетесь на STM32 реализовать? Но зачем??? wacko.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.