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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> ARM9 и SD карта - скорость доступа
Serg_D
сообщение Oct 28 2008, 12:22
Сообщение #1


Участник
*

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



День добрый!
если у кого есть опыт, был бы весьма признателен за ответ на следующий вопрос:

утрированно задача следующая -
есть необходимость считывать с SD карты данные из разных файлов, причём относительно мелкими порциями (килобайт по 16). Т.е допустим на карте 1000 файлов, необходимо открыть их все и последовательно считывать,
из первого файла 16 кило, из второго 16 кило итд, и так по кругу, складывая это в буфера в озу.

Так вот в разрезе этой задачи интересуют оценки сверху по времени на следующие операции -

1 - переключение чтения с одного файла на другой (получается переключение с одногосеткора на другой, для нанд флэши эти данные есть, но ведь в карте свой контроллер)

2 - время открытия файла, если это FAT

А если файлов не 1000 а 64 допустим?

чтение будет требоваться, примерно 3-6 мегабайт в секунду...

Сорри за расплывчатое объяснение, необходимо понять стоит ли покупть отладочную плату для опытов в принципе - или затея изначально не решаемая.

По АРМ-ам - смотрю в сторону атмелов SAM9X или NXP (по перефирии подкупает новая серия 3130, но отладочные платы видимо будут ещё не скоро...), у них есть SDIO - тюе можно получить (видимо) вменяемую скорость...

Спасибо!
Go to the top of the page
 
+Quote Post
KAlex
сообщение Oct 28 2008, 13:45
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 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 так уж точно.
Go to the top of the page
 
+Quote Post
zksystem
сообщение Oct 28 2008, 14:08
Сообщение #3


embedder
***

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



Цитата(Serg_D @ Oct 28 2008, 15:22) *
утрированно задача следующая -
есть необходимость считывать с SD карты данные из разных файлов, причём относительно мелкими порциями (килобайт по 16). Т.е допустим на карте 1000 файлов, необходимо открыть их все и последовательно считывать,

1000 файлов - лучше всего объеденить в один файл с шапкой-таблицей со смещением относительно начала файла, писать на отформатированную флешку (читать без FAT), тогда и скорость будет выше и можно будет в корень положить (так как в FAT макс. количество файлов в корне не более 128 включая метку диска).


--------------------
Мечты стареют куда быстрее мечтателей… Стивен Кинг. "Ловец снов"
Go to the top of the page
 
+Quote Post
Serg_D
сообщение Oct 28 2008, 14:30
Сообщение #4


Участник
*

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



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

т.е это десякти микросекунд, сотни, или милисекундны...
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Oct 28 2008, 16:59
Сообщение #5


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Думается мне, что держать "открытыми" 1000 файлов уже дело хорошее. Дла начала можно было бы это дело испытать на PC. USB-ный reader не так уж медленно работает.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Oct 28 2008, 19:08
Сообщение #6


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 не так уж медленно работает.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 28 2008, 19:19
Сообщение #7


Гуру
******

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



Цитата(AlexandrY @ Oct 28 2008, 22:08) *
Для SDIO думаю выложу результаты, а вот для SPI 20 МГц на ARM 100 МГц мной был для FAT получен результат: открытие файла - 2.5...10 мс, закрытие файла - 8...10 мс.

Совершенно абстрактные цифири, ибо зависят от реализации работы с FAT. Ну и 10ms для закрытия файла открытого на чтение вообще совершенно дикое число для просто "забыть" про файл.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Oct 28 2008, 20:27
Сообщение #8


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(zltigo @ Oct 28 2008, 23:19) *
Совершенно абстрактные цифири, ибо зависят от реализации работы с FAT. Ну и 10ms для закрытия файла открытого на чтение вообще совершенно дикое число для просто "забыть" про файл.


Ну может товарищ дескриптор файлов динамически в куче создает, а по закрытию - освобождает. Можно и такие цифры заполучить.
Go to the top of the page
 
+Quote Post
Serg_D
сообщение Oct 28 2008, 20:30
Сообщение #9


Участник
*

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



Я уже понял что для оптимизации лучше все данные "слить" в один файл исключив фрагментацию итп, и после этого просто переходить на нужнный сектор для чтения нужных данных, это вполне реализуемо. Единственное что мне нужно - чтоб карта читалась под Win на обычном компе, пусть даже она содержит один большой файл =)

Т.е задача сводится к чтению со случайного места в одном, ну или в нескольких файлах.

При этом мне необходимо только чтение, никакой записи.

Если для карт существуют какие-то градации "качества" (я читал про подобные для SDHC), то тоже могу вполне ограничиться использованием только карт "класса АБС и выше".

Всё что мне нужно, быть у веренным что в данных условиях я могу заложиться на время доступа меньше допустим к примеру 10-ти милисекунд, т.е какого-то ограниченного времени, ну и конечно хотелось бы минимального =)
Go to the top of the page
 
+Quote Post
VslavX
сообщение Oct 29 2008, 09:11
Сообщение #10


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
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Oct 29 2008, 09:53
Сообщение #11


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

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Такой обьем можно и в ОЗУ кешировать. Если выберете ARM с внешней памятью.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
Wano
сообщение Oct 29 2008, 14:24
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 272
Регистрация: 3-06-06
Пользователь №: 17 737



Ну раз разговор зашёл про SD,не стал создавать тему. Спрошу малость не по теме.
Может кто знает, как заставить EFSL не буферить данные. Уменьшил IOMAN_NUMBUFFER до 1-го - но один чёрт не сбрасывает, пока файл опять не откроешь.
Последовательность работы такова:
1) открыть файл
2) записать пару сотен байт
3) закрыть файл
4) вернуться к пункту 1-н
Если пропадает питание или ресет, то получается кривой файл. Пропадает не только последняя запись, но и повреждается FAT.
Выяснил, что EFSL скидывает всё на диск только когда даётся команда размонтировать.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Oct 29 2008, 17:02
Сообщение #13


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(Wano @ Oct 29 2008, 18:24) *
Ну раз разговор зашёл про SD,не стал создавать тему. Спрошу малость не по теме.
Может кто знает, как заставить EFSL не буферить данные. Уменьшил IOMAN_NUMBUFFER до 1-го - но один чёрт не сбрасывает, пока файл опять не откроешь.
Последовательность работы такова:
1) открыть файл
2) записать пару сотен байт
3) закрыть файл
4) вернуться к пункту 1-н
Если пропадает питание или ресет, то получается кривой файл. Пропадает не только последняя запись, но и повреждается FAT.
Выяснил, что EFSL скидывает всё на диск только когда даётся команда размонтировать.


EFSL вся из кривостей. Чем быстрее переберешься на FatFS, тем меньше проблем в будущем.
Go to the top of the page
 
+Quote Post
zhz
сообщение Oct 29 2008, 17:16
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 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 smile.gif
FatFS вполне вменяемая FS.
Go to the top of the page
 
+Quote Post
KonstantinT
сообщение Oct 30 2008, 05:31
Сообщение #15


Участник
*

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



Цитата(zhz @ Oct 29 2008, 20:16) *
В FatFS для таких случаев есть функция f_sync():
Так что брось ты эту efsl smile.gif
FatFS вполне вменяемая FS.

Да, только прикрутить к ней буферизацию нормальную.
Go to the top of the page
 
+Quote Post

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

 


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


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