|
|
  |
Время записи в SD-card, Почему разное время записи |
|
|
|
May 17 2011, 10:01
|
Группа: Новичок
Сообщений: 5
Регистрация: 25-08-09
Пользователь №: 52 030

|
Цитата(VslavX @ May 17 2011, 15:33)  CMD42, с установленным флажком ERASE. По идее - команда обычного стирания (CMD38) тоже должна помочь, но ее я не пробовал. Возможно у Вас в один и тот же сектор пишется несколько раз после стирания (если там файловая система типа FAT, то такое вполне может быть) - поэтому задержки не устранились. Спасибо за ответ, но: 1. Команда CMD42, если я все правильно понимаю, предназначена для блокирования/разблокирования карты. Установка в этой команде флажка ERASE приведет к тому, что в дальнейшем картой будут блокироваться запросы на стирание. 2. На данном этапе я просто тестирую карты и еще не использую файловую систему. Результатом тестирования является гисторграмма распределения длительности записи. Запись в моем тесте идет последовательно и адреса наращиваются тоже последовательно. Так вот, тест показал, что при записи 80000 кусков данных (каждый кусок - это 64 блока по 512 байт) или что тоже самое 2.5 Гбайт на SDHC время записи у, примерно, 5-15 кусков превышает 50 мс. в то время как у оставшихся 7995-7985 кусков оно не превышает и 6 мс!!! 3. Использование команды CMD38 не помогло устранить этой проблемы. 'VslavX' возможно ли как то хотя бы взглянуть на Ваши условия тестирования и полученные результаты ??? Еще что интересно, так это то, что и на зарубежных сайтах не дают четкого ответа откуда возникают это большое "busy time" при мультиблоковой записи и как с ним бороться!!! Тогда как работают, например, видеокамер, которые используют SD карты ??? неужели у них такой большой внутренний буфер (ОЗУ), что его хватает аж на 250 мс видеопотока (250 мс вроде как заявлено в спецификации). Еще раз спасибо 'VslavX' за ответ
|
|
|
|
|
May 17 2011, 10:40
|

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

|
Цитата(shishka @ May 17 2011, 13:01)  1. Команда CMD42, если я все правильно понимаю, предназначена для блокирования/разблокирования карты. Да, для блокирования-разблокирования. Но, допустим, у Вас есть карта с установленным паролем, и Вы его забыли. Что делать? Выкидывать всю карту? Ж-а-а-а-лко  Вот поэтому и есть опция ERASE - снимается пароль, а перед этим стираются все данные которые были этим паролем защищены, так сказать карта приводится "к печке" - в некоторое начальное состояние. Кстати, я использовал в тестах стирание через команду CMD42 не потому что "что-то знал", а просто у меня был готовый код и лень было писать процедуры с использованием CMD38. Цитата(shishka @ May 17 2011, 13:01)  Установка в этой команде флажка ERASE приведет к тому, что в дальнейшем картой будут блокироваться запросы на стирание. Хм, а почему Вы так думаете? Я что-то пропустил/недопонял в стандарте? Цитата(shishka @ May 17 2011, 13:01)  возможно ли как то хотя бы взглянуть на Ваши условия тестирования и полученные результаты ???  Взглянуть можно на функцию теста - она очень простая. Варьируя число в цикле j<128 я пробовал разное количество записей в один и тот же сектор, и выводил к консоль время выполнения операций которые длились более 10мс. Снаружи еще была функция стирания по CMD42 - все эти тестовые функции можно было запускать по клавишам в консоли в произвольном порядке. Точных результатов, к сожалению, не помню, и этот-то кусочек кода случайно сохранился. Сначала я выводил информацию о времени всех операций в файл - получил представление о среднем времени записи и о спорадических задержках. Потом выполнил CMD42 и увидел что ситуация намного улучшилась если одна запись в один сектор. Ну а потом уже поставил лимит time<10000 - и игрался наблюдая только задержки. CODE static void io_test_mmc_wsecbytes(void) { IO_STATUS io_status; DWORD size, i, j, time, n;
n = 0; size = io_mmc_size(); if (size != 0) { for(i=0; i<size; i++) { tst_printf("\r\nSector: %08X\f", i);
hal_memset(mmc_udma, 0xFF, sizeof(mmc_udma)); for(j=0; j<128; j++) { DWORD old;
mmc_udma[j] = i + j;
tn_task_raise_priority(TN_UPPER_APP_PRIORITY, &old); time = hal_profiler_counter(); io_status = io_mmc_write(i, 1, mmc_udma); time = hal_profiler_elapsed_us(time); tn_task_lower_priority(old);
if (io_status != IOERR_SUCCESS) { tst_printf("\r\nWrite %08X sector error: %d", i, io_status); return; } if (time > 10000) { tst_printf("\r\n %06d: %d\f", n, time); } n++; tn_task_sleep(MS_TO_TICKS(10)); if (hal_inkey() != 0) { return; } io_status = io_mmc_read(i, 1, mmc_ndma); if (io_status != IOERR_SUCCESS) { tst_printf("\r\nRead %08X sector error : %d", io_status); return; } if (hal_memcmp(mmc_ndma, mmc_ndma, IO_MMC_BLOCK_SIZE)) { tst_printf("\r\nRead data back are wrong"); return; } } } } }
Upd: я тут еще заметил что у меня пауза между операциями в 10 мс стоит, надо бы повторить тест без нее - а то не совсем чисто получается. Upd2: только что попробовал старую SD-micro карту на 512Мбайт - так она и по 128 записей на сектор и без предварительного стирания всегда в 10 мс укладывается. Я примерно час буду занят - потом попробую более тостые карты и без задержки 10 мс - отпишусь.
|
|
|
|
|
May 17 2011, 10:44
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(shishka @ May 17 2011, 14:01)  Еще что интересно, так это то, что и на зарубежных сайтах не дают четкого ответа откуда возникают это большое "busy time" при мультиблоковой записи и как с ним бороться!!! Откуда берется не пишут, так как это внутренняя кухня производителя (и у каждого своя), и нет нужды знакомить с ней общественность. На деле все и так более-менее понятно: стирание нового блока, перенос данных из частично пустого для подготовки к стиранию и т.п. издержки организации хранения данных в NAND. Бороться нельзя никак, природу не обманешь. Цитата(shishka @ May 17 2011, 14:01)  Тогда как работают, например, видеокамер, которые используют SD карты ??? неужели у них такой большой внутренний буфер (ОЗУ), что его хватает аж на 250 мс видеопотока (250 мс вроде как заявлено в спецификации). Конечно, используется достаточно большой буфер: 2-4 мегабайта - это по нынешним временам почти ничего.
|
|
|
|
|
May 17 2011, 11:53
|
Группа: Новичок
Сообщений: 5
Регистрация: 25-08-09
Пользователь №: 52 030

|
Спасибо за ответы.
Для VslavX: По поводу команды CMD42 с установленным флагом ERASE - прошу прощения я не корректно перевел спецификацию.
|
|
|
|
|
May 20 2011, 07:48
|
Группа: Новичок
Сообщений: 5
Регистрация: 25-08-09
Пользователь №: 52 030

|
Ну вот - теперь у Вас почти совсем как и у меня
|
|
|
|
|
Jun 27 2011, 10:54
|
Частый гость
 
Группа: Участник
Сообщений: 109
Регистрация: 19-01-11
Пользователь №: 62 335

|
В очередной раз убедился, что абсолютно новая карточка с магазина, ведет себя намного лучше прописал 1гиг, по 32кБ каждые 100мС, все нормально, правда у меня есть небольшая буферизация. Но стоит только начать писать по писанному  все начинаются сюрпризы с большими задержками. Пробовал разные способы форматирования, даже форматировал прогой от производителя, все равно не достигнул того, что было когда карта была новой. Как привести карту к первоначальному состоянию?
|
|
|
|
|
Jun 27 2011, 14:14
|
Знающий
   
Группа: Участник
Сообщений: 745
Регистрация: 28-12-06
Пользователь №: 23 960

|
Цитата(*rust* @ Jun 27 2011, 14:54)  Как привести карту к первоначальному состоянию? А смысл??? Допустим приведете вы карточку к магазинному состоянию (вообще не факт что это в принципе возможно) и что дальше? Повесите в рамочке на стену? Как только начнете использовать карту - сразу возникнут задержки. Расчитывайте буфер на указанное в документации время записи до 250мс и будете спать спокойно!
|
|
|
|
|
Jun 27 2011, 17:59
|
Частый гость
 
Группа: Участник
Сообщений: 109
Регистрация: 19-01-11
Пользователь №: 62 335

|
Цитата Расчитывайте буфер на указанное в документации время записи до 250мс и будете спать спокойно! Нет возможности сделать такой буфер. Цитата Повесите в рамочке на стену? При чем тут стена? Я же говорю, что новая ведет себя вполне достойно! Если перед каждым использованием проделывать процедуру приведения в первоначальное состояние, меня бы это устроило. Цитата Как только начнете использовать карту - сразу возникнут задержки. Еще раз, на совершенно новой SD-card прописал 1GB, задержек было очень мало и они были короткие, моя буферизация это выравнивала.
|
|
|
|
|
Aug 31 2011, 11:49
|
Группа: Новичок
Сообщений: 4
Регистрация: 23-10-08
Пользователь №: 41 123

|
Цитата(*rust* @ Jun 27 2011, 21:59)  Нет возможности сделать такой буфер.
Еще раз, на совершенно новой SD-card прописал 1GB, задержек было очень мало и они были короткие, моя буферизация это выравнивала. *Rust* - в итоге все же было бы очень интересно знать как Вы разрешили свою проблему. Т.е. какой буфер Вы используете (32К) ? Как он устроен? Как кольцевой или обычное карамысло(2 области попеременно заполняемые и соответственно вычитываемые)? Как часто Вы закидываете данные в карту? У моего сотрудника похожая ситуация: ядро: AT91SAM3U4E, происходит опрос датчиков с частотой 2 милисекунды, за этот же период времени необоходимо закинуть на SD карточку 2кбайт данных, используем карамысло - 2 области по 4кбайт каждая (попробуем увеличить буфер, но думаю это возможно не более чем в 2 раза, в виду нагруженности другими задачами) . В результате работы имеем пропуски в записи на карту. Очень хочется решить проблемму имеющимися средствами, и очень не хочется вешать дополнительные внешние буфера памяти (хотя пока и не уверен что это возможно....). Спасибо!
|
|
|
|
|
Sep 1 2011, 05:06
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(bels @ Aug 31 2011, 15:49)  и очень не хочется вешать дополнительные внешние буфера памяти Из собственного опыта записи на SD - советую не надеяться на чудо, а начинать думать, как навесить буфера...
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Sep 1 2011, 15:37
|
Группа: Новичок
Сообщений: 4
Регистрация: 23-10-08
Пользователь №: 41 123

|
Цитата(Lotor @ Sep 1 2011, 09:06)  Из собственного опыта записи на SD - советую не надеяться на чудо, а начинать думать, как навесить буфера...  А каков гарантированный минимальный размер этого буфера(ов)? Немного не по теме... я бы хотел (если это конечно возможно) проконсультироваться более подробно с *Rust*( e-mail или Skype), но когда начинаю пытаться ему сбросить сообщение через форум - система выдает: "...Вам запрещено использовать личные сообщения на форуме...". Простите, но другой возможности как писать сюда у меня просто нету  ( Модераторы, жду Вашей помощи... Спасибо!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|