|
ARM9 и SD карта - скорость доступа |
|
|
|
Oct 28 2008, 12:22
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 3-12-04
Пользователь №: 1 307

|
День добрый! если у кого есть опыт, был бы весьма признателен за ответ на следующий вопрос:
утрированно задача следующая - есть необходимость считывать с SD карты данные из разных файлов, причём относительно мелкими порциями (килобайт по 16). Т.е допустим на карте 1000 файлов, необходимо открыть их все и последовательно считывать, из первого файла 16 кило, из второго 16 кило итд, и так по кругу, складывая это в буфера в озу.
Так вот в разрезе этой задачи интересуют оценки сверху по времени на следующие операции -
1 - переключение чтения с одного файла на другой (получается переключение с одногосеткора на другой, для нанд флэши эти данные есть, но ведь в карте свой контроллер)
2 - время открытия файла, если это FAT
А если файлов не 1000 а 64 допустим?
чтение будет требоваться, примерно 3-6 мегабайт в секунду...
Сорри за расплывчатое объяснение, необходимо понять стоит ли покупть отладочную плату для опытов в принципе - или затея изначально не решаемая.
По АРМ-ам - смотрю в сторону атмелов SAM9X или NXP (по перефирии подкупает новая серия 3130, но отладочные платы видимо будут ещё не скоро...), у них есть SDIO - тюе можно получить (видимо) вменяемую скорость...
Спасибо!
|
|
|
|
|
Oct 28 2008, 13:45
|

Местный
  
Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719

|
Цитата(Serg_D @ Oct 28 2008, 16:22)  1 - переключение чтения с одного файла на другой (получается переключение с одногосеткора на другой, для нанд флэши эти данные есть, но ведь в карте свой контроллер) Смотри разницу между CMD_17 (READ_SINGLE_BLOCK) и CMD_18 (READ_MULTIPLE_BLOCK). Грубо говоря, задержка на выдачу и респонс одной команды. Цитата(Serg_D @ Oct 28 2008, 16:22)  2 - время открытия файла, если это FAT А если файлов не 1000 а 64 допустим? Читаеш один раз фат во внутреннее озу и работай с ним. Цитата(Serg_D @ Oct 28 2008, 16:22)  чтение будет требоваться, примерно 3-6 мегабайт в секунду... Я на SAM7S делал 1.5, а там SDIO нет. ПЛИСина помогала. Так что думаю, вполне возможно. А если SDHC так уж точно.
|
|
|
|
|
Oct 28 2008, 14:08
|

embedder
  
Группа: Свой
Сообщений: 264
Регистрация: 11-05-05
Из: Казань
Пользователь №: 4 911

|
Цитата(Serg_D @ Oct 28 2008, 15:22)  утрированно задача следующая - есть необходимость считывать с SD карты данные из разных файлов, причём относительно мелкими порциями (килобайт по 16). Т.е допустим на карте 1000 файлов, необходимо открыть их все и последовательно считывать, 1000 файлов - лучше всего объеденить в один файл с шапкой-таблицей со смещением относительно начала файла, писать на отформатированную флешку (читать без FAT), тогда и скорость будет выше и можно будет в корень положить (так как в FAT макс. количество файлов в корне не более 128 включая метку диска).
--------------------
Мечты стареют куда быстрее мечтателей… Стивен Кинг. "Ловец снов"
|
|
|
|
|
Oct 28 2008, 14:30
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 3-12-04
Пользователь №: 1 307

|
спасибо за ответы. на самом деле больше всего интересует время "перепозиционирования" с одного файла на другой, или с одного положения в файле на другое, т.е не потоковое чтение а рандомное так сказать.
т.е это десякти микросекунд, сотни, или милисекундны...
|
|
|
|
|
Oct 28 2008, 19:08
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Можно одновременно не открывать все файлы. А открывать асинхронно только ближайшую десятку в отделных задачах. Конечно, не принято держать открытыми много файлов поскольку в файловых системах не оптимизируется поиск по списку открытых файлов и еще потенциально такая операция может оставить дико фрагментированный heap не говоря уж о ресурсах на такое действие. Для SDIO думаю выложу результаты, а вот для SPI 20 МГц на ARM 100 МГц мной был для FAT получен результат: открытие файла - 2.5...10 мс, закрытие файла - 8...10 мс. Очень предварительно, статистика буквально с нескольких попыток. Самое большое влияние на скорость оказывает состояние самой SD карты. Собственно оно не предсказуемо. Чем больше было записано и стерто файлов на SD тем тормознее она становится. Цитата(sergeeff @ Oct 28 2008, 21:29)  Думается мне, что держать "открытыми" 1000 файлов уже дело хорошее. Дла начала можно было бы это дело испытать на PC. USB-ный reader не так уж медленно работает.
|
|
|
|
|
Oct 28 2008, 20:30
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 3-12-04
Пользователь №: 1 307

|
Я уже понял что для оптимизации лучше все данные "слить" в один файл исключив фрагментацию итп, и после этого просто переходить на нужнный сектор для чтения нужных данных, это вполне реализуемо. Единственное что мне нужно - чтоб карта читалась под Win на обычном компе, пусть даже она содержит один большой файл =)
Т.е задача сводится к чтению со случайного места в одном, ну или в нескольких файлах.
При этом мне необходимо только чтение, никакой записи.
Если для карт существуют какие-то градации "качества" (я читал про подобные для SDHC), то тоже могу вполне ограничиться использованием только карт "класса АБС и выше".
Всё что мне нужно, быть у веренным что в данных условиях я могу заложиться на время доступа меньше допустим к примеру 10-ти милисекунд, т.е какого-то ограниченного времени, ну и конечно хотелось бы минимального =)
|
|
|
|
|
Oct 29 2008, 09:11
|

embarrassed systems engineer
    
Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038

|
Скорость доступа к отдельному произвольному сектору карты на 90% зависит от самой карты. При чтении по одному сектору на "правильном" контроллере (который держит тактовую при обмене в пределах 20-25МГц или даже выше для новых карт) основное время - это ожидание готовности карты после посылки ей команды чтения - за это время контроллер карты найдет внутри сектор, выполнит все необходимые внутренние процедуры ремаппинга и коррекции и будет готов отдавать данные по шине контроллеру. Так вот, это характерное время составляет порядка 1 миллисекунды. Время самого обмена данными сектора - пренебрежимо мало - 512*8 - 4Кбита - 1К циклов на 4-х битной шине - при 25МГц - всего 40мкс. И если читать по одному сектору "вразброс" то получим скорость - порядка 512*1K (1000 циклов по 1мс) - всего 512Килобайт. Эта скорость может быть чуть выше или чуть ниже - в-основном зависит от карты, но на двух десятках проверенных мной карт, включая самые новые SDHC, не поднималась выше 2Мбайт/сек. Другое дело, что контроллер карт очень сильно оптимизирован на операции с последовательными секторами -тут уже скорость может существенно быть выше - при чтении по 32 сектора мне удавалось на SD подняться и до 8Мбайт/сек. Если используется файловая система - то, скорее всего, читать можно будет именно кластерами по нескольку секторов за одну операцию, и оптимизацией контроллера под групповые операции вполне можно воспользоваться.
P.S. Вот результаты испытаний на S2410 - аппаратный контроллер MMC/SD - частота тактирования шины MMC/SD 16.625МГц (и дело было в 2006 - карты были не особо новые)
MMC SD Теоретическая пропускная способность (max): 2.08MBps 8.31 MBps
Результаты практических испытаний Чтение по одному 512-байтному блоку: 0.83 MBps 1.79 MBps Чтение группами по 8 512-байтных блоков: 1.40 MBps 5.41 MBps Чтение группами по 12 512-байтных блоков: 1.54 MBps 5.70 MBps Чтение группами по 16 512-байтных блоков: 1.60 MBps 5.81 MBps Чтение группами по 120 512-байтных блоков: 1.87 MBps 7.78 MBps
Запись по одному 512-байтному блоку: 0.19 MBps 0.42 MBps Запись группами по 12 512-байтных блоков: 0.40 MBps 1.69 MBps
|
|
|
|
|
Oct 29 2008, 17:16
|

Частый гость
 
Группа: Свой
Сообщений: 80
Регистрация: 21-03-05
Пользователь №: 3 559

|
Цитата(Wano @ Oct 29 2008, 16:24)  Если пропадает питание или ресет, то получается кривой файл. Пропадает не только последняя запись, но и повреждается FAT. Выяснил, что EFSL скидывает всё на диск только когда даётся команда размонтировать. В FatFS для таких случаев есть функция f_sync(): Цитата f_sync The f_sync function flushes the cached information of a writing file.
Description 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 applications that open files for a long time in writing mode, such as data logger. Performing f_sync of periodic or immediataly after f_write can minimize risk of data loss due to a sudden blackout or an unintentional disk removal. This function is not supported in read-only configuration. Так что брось ты эту efsl  FatFS вполне вменяемая FS.
|
|
|
|
|
Oct 30 2008, 05:31
|
Участник

Группа: Новичок
Сообщений: 29
Регистрация: 3-11-04
Пользователь №: 1 027

|
Цитата(zhz @ Oct 29 2008, 20:16)  В FatFS для таких случаев есть функция f_sync(): Так что брось ты эту efsl  FatFS вполне вменяемая FS. Да, только прикрутить к ней буферизацию нормальную.
|
|
|
|
|
Nov 1 2008, 21:47
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Кстати, вот идейка: Проверил скорость работы NAND FLASH MT29F2G08AACWP (256 MByte, 5$ на DigiKey) на ARM9 Чтение происходит с очень стабильной соростью - 8.48 MByte/s Использовался режим чтения с кэшированием в NAND. Так файлы можно переписать на NAND и получить очень предсказуемую скорость считывания. Максимальная скорость считывания c SD карты 60X Apacer была около 5 Mbyte/s Карта работала в 4-х битном режиме на 26 МГц (дал оверклокинга) Так что байки насчет 8 MByte/s с SD карт оставим на совести сочинителя. Цитата(Serg_D @ Oct 28 2008, 16:52)  День добрый! если у кого есть опыт, был бы весьма признателен за ответ на следующий вопрос:
утрированно задача следующая - есть необходимость считывать с SD карты данные из разных файлов, причём относительно мелкими порциями (килобайт по 16). Т.е допустим на карте 1000 файлов, необходимо открыть их все и последовательно считывать, из первого файла 16 кило, из второго 16 кило итд, и так по кругу, складывая это в буфера в озу.
Так вот в разрезе этой задачи интересуют оценки сверху по времени на следующие операции -
1 - переключение чтения с одного файла на другой (получается переключение с одногосеткора на другой, для нанд флэши эти данные есть, но ведь в карте свой контроллер)
2 - время открытия файла, если это FAT
А если файлов не 1000 а 64 допустим?
чтение будет требоваться, примерно 3-6 мегабайт в секунду...
Сорри за расплывчатое объяснение, необходимо понять стоит ли покупть отладочную плату для опытов в принципе - или затея изначально не решаемая.
По АРМ-ам - смотрю в сторону атмелов SAM9X или NXP (по перефирии подкупает новая серия 3130, но отладочные платы видимо будут ещё не скоро...), у них есть SDIO - тюе можно получить (видимо) вменяемую скорость...
Спасибо!
|
|
|
|
|
Nov 1 2008, 22:54
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(AlexandrY @ Nov 2 2008, 00:47)  Максимальная скорость считывания c SD карты 60X Apacer была около 5 Mbyte/s Экстремально дешовая карточка с действительно мало к чему обязывающими "60X" или другими "X" Цитата Так что байки насчет 8 MByte/s с SD карт оставим на совести сочинителя. А слабо было попробовать карточки отмаркированные не абстрактными и непонятно к чему обязывающими наклейщика этикеток "Apacer" письменами 60X, а маркированые официально, как SDHC Class 2/4/6/8 ? Причем встречал для любителей X карточку SDHC Class 6 дополнительно маркированную, как 133X
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 3 2008, 18:56
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Так, турбировал NAND. Неплохо держит до 43 МГц при штатных 33 МГц Скорость чтения при этом 13.2 MByte/s. Apacer 60X действительно мутная штука. Для двух карт с одинаково написанными 60X был разный параметр SD data_read_access_time1 из области Card-Specific Data register (CSD) У одной 0.02 у другой 0.005. Тема не закрыта. Насчет быстродействия непосредственно FAT на этих картах сообщу позже. SDHC проверить не смогу ибо у меня интерфейс SDIO специфицирован на 25 МГц. Т.е. на нем самая быстрая карта не потянет больше 12.5 Mbyte/s в пределе. Вот USB HS флеши можно попробывать. Но это когда поднимется соответствующая тема Цитата(zltigo @ Nov 2 2008, 03:24)  Экстремально дешовая карточка с действительно мало к чему обязывающими "60X" или другими "X"
А слабо было попробовать карточки отмаркированные не абстрактными и непонятно к чему обязывающими наклейщика этикеток "Apacer" письменами 60X, а маркированые официально, как SDHC Class 2/4/6/8 ? Причем встречал для любителей X карточку SDHC Class 6 дополнительно маркированную, как 133X
|
|
|
|
|
Nov 4 2008, 20:51
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 3-12-04
Пользователь №: 1 307

|
Вопрос попутный - я правильно понимаю что если использовать CompactFlash карты, то с предсказуемостью чтения (да и со скоростью) будет по-лучше?
Правда отладочные платки ARM9 и CF сейчас не в ходу смотрю, нашел только тион, но циррус по перефирии не подходит...
|
|
|
|
|
Nov 5 2008, 23:18
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 3-12-04
Пользователь №: 1 307

|
спасибо! однако открытие до 60 милисекунд если я на ночь глядя ничего не напутал...
Сообщение отредактировал Serg_D - Nov 5 2008, 23:29
|
|
|
|
|
Nov 6 2008, 14:14
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Быстрая многозадачная FAT штука достаточно сложная с хитрым кэшированием. Еще немного турбировал, подрегулировал буфера и несколько улучшил результаты. Теперь файловая система требует RAM-а для буферов больше мегабайта, но я реализовал вашу идею насчет одновременно открыть 1000 файлов. Результаты смотрите в том же файле по ссылке. Оказалось не так опасно как предпологал. Система не валится. Даже оказалось что уже открытые файлы в среднем читаются несколько быстрее чем в обычной последовательности. Но среднее время открытия при открытии всех файлов сразу замедляется как и предпологал. Кажущееся неоправданно большим время закрытия объясняется тем, что система делает много проверок на валидность, доступ из других задач, освобождений блокируемого многозадачного heap-а и блокировок. Тоже самое можно наблюдать в Windows при работе с файлами на SD. Короче, предсказуемость и скорость чтения достаточны и ваша первоначальная идея вполне может быть реализована, и моя тоже Цитата(Serg_D @ Nov 6 2008, 03:48)  спасибо! однако открытие до 60 милисекунд если я на ночь глядя ничего не напутал...
|
|
|
|
|
Nov 6 2008, 14:42
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 3-12-04
Пользователь №: 1 307

|
т.е то что вы сейчас реализовали - это примерно равносильно тому чтоб читать из одного, допустим гигабайтного файла в случайном порядке с разных мест?
|
|
|
|
|
Nov 6 2008, 17:03
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Более того - с 10-и гигабайтного файла! Еще поддать только RAM-а мега на два и можно открывать и 2-е и 3-и тысячи файлов. Поскольку на старт операции чтения открытого файла не было замечено влияния количества открытых файлов. Впрочем в отчете достаточно статистики чтобы вы сами могли найти корреляции и их доверительные оценки. Цитата(Serg_D @ Nov 6 2008, 19:12)  т.е то что вы сейчас реализовали - это примерно равносильно тому чтоб читать из одного, допустим гигабайтного файла в случайном порядке с разных мест?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|