Перейти к содержанию
    

Всем привет. Столкнулся с такой проблемой: время записи данных в SD-card разное. Опишу все по порядку:

 

ядро: AT91SAM3U4E

SD-card: SanDisk 2GB

 

Данные пишет ARM3 в SD-card, используя библиотеку от Чена. Размер буфера для записи 16кБ.

Перед функцией записи ножку ARMа устанавливаю в "1" после сбразываю в "0", тем самым определяю время записи.

Запуск записи ручной в железе от кнопки (не в дебагере).

С 1 по 31 итерацию время записи 3 мС, 32 итерация длится 40 мС, далее цикл повторяется. Вот такая засада.

 

Кто сталкивался или знает, что происходит во время 32 итерации записи? Первое, что приходит в голову - это размер буфера в SD-card, примечательно, что 16*32=512, и вполне возможно буфер в SD-card равен 512 кБ. Когда он заполняется, то контроллер, который стоит в SD-card, переписывает его в память. Конечно, сильно притянуто за уши, тем более, что запись во флеш идет постраничная, а размер станиц равный 512кБ я нигде не встречал.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кто сталкивался или знает, что происходит во время 32 итерации записи?

Скорее всего, происходит стирание нового блока - у NAND они достаточно крупные. А вообще, так как внутри SD-карты живет еще целый уровень, обеспечивающий выравнивание износа, подмену битых блоков и тому подобное, задержки при записи могут быть достаточно случайными.

 

Проблемой такое поведение не является, и средняя скорость у вас получилась вполне на уровне.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблемой такое поведение не является, и средняя скорость у вас получилась вполне на уровне.

 

Да как сказать! Мне приходиться писать каждые 100mC 32кБ, с учетом того, есть еще подготовительные операции, то на запись в SD-card отводится 25mC(max), поэтому для меня это проблема.

 

задержки при записи могут быть достаточно случайными.

Целый вечер вчера тестил, задержка появлялась только после 512кБ, в моем случае на 32 итерации.

 

У меня достаточно старая SD, 2 года ей где-то, может быть современные ведут себя по другому? И второй вопрос: Программно, существует способ перераспределить время записи?

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да как сказать! Мне приходиться писать каждые 100mC 32кБ, с учетом того, есть еще подготовительные операции, то на запись в SD-card отводится 25mC(max), поэтому для меня это проблема.

Буферизируйте.

 

У меня достаточно старая SD, 2 года ей где-то, может быть современные ведут себя по другому? И второй вопрос: Программно, существует способ перераспределить время записи?

Карта это достаточно сложный черный ящик, ее внутренняя жизнь не документирована. Согласно спецификации длительность записи может доходить до сотни мс. Вот согласно спецификации и работайте!

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Буферизируйте.

 

Это как???

 

Сейчас полазил по производителям нашел разные современные карты со скоростью записи до 90MB/s какая-то сумасшедшая скорость, даже не вериться, дороговато к тому же.

 

Присмотрелся к SDHC SanDisk SDSDRX3-04G скорость записи 20 МБ/сек, Extreme Class 6 цена 990р. Должна быть побыстрей моей.

Как Вы думаете, стоит?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это как???

 

Что-то непонятна ваша проблема. Вы вообще с файловыми операциями работаете или голые блоки пишете?

У файловый операций есть время открытия файла, время закрытия, время позиционирования, время записи, время чтения.

Вы о какой проблеме хотите поговорить?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сейчас полазил по производителям нашел разные современные карты со скоростью записи до 90MB/s какая-то сумасшедшая скорость, даже не вериться, дороговато к тому же.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то непонятна ваша проблема. Вы вообще с файловыми операциями работаете или голые блоки пишете?

У файловый операций есть время открытия файла, время закрытия, время позиционирования, время записи, время чтения.

Вы о какой проблеме хотите поговорить?

 

По-моему все написано предельно ясно в первом посте, если нет прошу прощения, перепишу снова:

 

!Для работы с SD-card использую библиотека от Сhan.

 

Сперва монтирую диск, создаю файл и открываю его. Время выполнения этих операций меня не интересуют.

Далее каждые 100mC происходит измерения, неважно какое, результатом которого является массив данных объемом 16кБ, при этом на запись этого массива в карту остается 25mС. Когда данные готовы к записи файл уже открыт, поэтому я могу определить время выполнения функции записи. Итак с 1 по 31 итерацию записи время 3mC, а 32 итерация длиться 40mC. После каждой итерации файл не закрывается. Файл я закрываю тогда, когда это необходимо. Думаю, все достаточно подробно.

 

Сама проблема в очень большом времени записи на 32 итерации.

 

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

 

Посмотрите эту карту: Карта памяти CompactFlash SanDisk SDCFXP-032G

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Далее каждые 100mC происходит измерения, неважно какое, результатом которого является массив данных объемом 16кБ, при этом на запись этого массива в карту остается 25mС. Когда данные готовы к записи файл уже открыт, поэтому я могу определить время выполнения функции записи. Итак с 1 по 31 итерацию записи время 3mC, а 32 итерация длиться 40mC. После каждой итерации файл не закрывается. Файл я закрываю тогда, когда это необходимо. Думаю, все достаточно подробно.

По спецификации операция записи может занимать до 250мс. Ваша программа должна обеспечивать буферизацию данных как минимум на это время.

Пытаться решить проблему подбором карты в корне неправильно. "Class 6" говорит о том, что средняя скорость не менее 6Мбайт/с, но это не значит, что задержки постоянны. Кстати, как показывают эксперименты, у современных карт при большей средней скорости максимальное время записи обычно больше, чем у карт 2-3 летней давности.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да как сказать! Мне приходиться писать каждые 100mC 32кБ, с учетом того, есть еще подготовительные операции, то на запись в SD-card отводится 25mC(max), поэтому для меня это проблема.

Я недавно занимался тестированием SD-карт, в том числе измерял время записи сектора при массированной последовательной записи блоков различной длины. Поделюсь результатами и своей теорией.

Тест 1 - пишем последовательно в сектор записи по 16 байт, сектор закончился - берем следующий, с номером на единичку большим. Результат - типовое время записи порядка 1 мс (несколько зависит от типа карты и класса), но каждые примерно N записей - провал с некоторым типовым значением. Это значение составляет от 30 мс у самой быстрой новейшей SD 3.0 карты (30Мбайт/сек) до 300 мс у нестарой и заявленной как класс 4 SDHC. Карты 4-5 летней давности уложились в пределы 60-150мс.

Тест 2 - карта предварительно стерта командой SET_LOCK_UNLOCK. Пишем последовательно по целому сектору - типовое время записи сектора осталось то же самое, периодические 'выбросы' тоже есть, но они сократились очень значительно - ну раза в полтора-два больше чем типовое время записи. То есть карта в худшем случае 'думает' всего 2..5мс.

Eще был ряд тестов с привлечением команд стирания, я уже деталей полностью не помню.

Выводы у меня такие - карта, ее внутренний контроллер и его прошивка это черный ящик, но - 99% что основной массив флеш памяти "исповедует" принципы NAND - можно писать страницами (под размер сектора) и стирать только блоками (группами страниц). Отсюда следует основа алгоритма записи - заводится внутри некоторый пул свободных стертых страниц (размер пула равен периоду 'выбросов' времени записи), когда он заканчивается - информация переносится в основное хранилище - или ремаппингом (изменением индексов в базе) или тупо перезаписыванием. Также есть сильное подозрение что если есть возможность записывать сектор сразу на постоянное место (пишущийся сектор в основном массиве "стерт") то пишется на постоянное место.

Итого - если нужный набор секторов стереть (командами стирания) и писать каждый сектор не более одного раза - то такие 'спорадические' увеличения времени записи можно в большинстве случаев купировать. Эксперимент это подтверждает, проверено около 10 карт SD/SDHC разного возраста, объема и производителей.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Понятно, смысл ясен. Спасибо всем участникам обсуждения за ликбез. Я все же прикуплю ряд карт разной давности и различных классов и проделаю опыты с замером скорости записи и задержек. Результаты могу выложить здесь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У AT91SAM3U есть поддержка MMC Specification V4.3, как Вы думаете у карт MMCplus задержки записи будут меньше чем у SDcard?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У AT91SAM3U есть поддержка MMC Specification V4.3, как Вы думаете у карт MMCplus задержки записи будут меньше чем у SDcard?

Думаю, будут примерно такие же. Чтобы гарантированно писать 32кБайт/мс на SAM3U нужна внешняя память, иначе никак.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Доброого времени суток.

У меня та же проблема с SD картами. Среднюю скорость записи на карту без проблем достигаю 4-6 Мбайт/с. Пишу по кусками по 32 кБайт при помощи CMD25. И мне ужасно мешают жить эти большие задержки по 30-150 мс !!! На проце уже нет свободной ОЗУ, чтобы буфферизировать данные в течение этого времени. Максимум могу делать буфферизацию в течение 25 мс.

Использование команды Pre-erase существенного выигрыша не дает. При предварительном стирании больших кусков памяти при помощи команды CMD38 также не увидел пропадания этих больших задержак при WRITE_MULTIPLY_BLOCK.

 

Поэтому крайне интересно то, что написал "VslavX" :1111493779:

 

Цитирую:

"Тест 2 - карта предварительно стерта командой SET_LOCK_UNLOCK. Пишем последовательно по целому сектору - типовое время записи сектора осталось то же самое, периодические 'выбросы' тоже есть, но они сократились очень значительно - ну раза в полтора-два больше чем типовое время записи. То есть карта в худшем случае 'думает' всего 2..5мс. "

 

Так вот у меня возник вопрос к "VslavX" !!! Что это за команда такая предварительного стирания SET_LOCK_UNLOCK, которой Вы пользовались и которая Вам так облегчила жизнь ????? Можете написать ее номер ???

Вроде как в спецификации на карту оговорены только команды для стирания CMD38 (ERASE) и ACMD23(Pre-erase).

 

Спасибо

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...