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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Время записи в SD-card, Почему разное время записи
VslavX
сообщение May 17 2011, 09:03
Сообщение #16


embarrassed systems engineer
*****

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



Цитата(shishka @ May 17 2011, 11:16) *
Так вот у меня возник вопрос к "VslavX" !!! Что это за команда такая предварительного стирания SET_LOCK_UNLOCK, которой Вы пользовались и которая Вам так облегчила жизнь ????? Можете написать ее номер ???

CMD42, с установленным флажком ERASE.
По идее - команда обычного стирания (CMD38) тоже должна помочь, но ее я не пробовал. Возможно у Вас в один и тот же сектор пишется несколько раз после стирания (если там файловая система типа FAT, то такое вполне может быть) - поэтому задержки не устранились.
Go to the top of the page
 
+Quote Post
shishka
сообщение May 17 2011, 10:01
Сообщение #17





Группа: Новичок
Сообщений: 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' возможно ли как то хотя бы взглянуть на Ваши условия тестирования и полученные результаты ??? rolleyes.gif

Еще что интересно, так это то, что и на зарубежных сайтах не дают четкого ответа откуда возникают это большое "busy time" при мультиблоковой записи и как с ним бороться!!! Тогда как работают, например, видеокамер, которые используют SD карты ??? неужели у них такой большой внутренний буфер (ОЗУ), что его хватает аж на 250 мс видеопотока (250 мс вроде как заявлено в спецификации).

Еще раз спасибо 'VslavX' за ответ laughing.gif
Go to the top of the page
 
+Quote Post
VslavX
сообщение May 17 2011, 10:40
Сообщение #18


embarrassed systems engineer
*****

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



Цитата(shishka @ May 17 2011, 13:01) *
1. Команда CMD42, если я все правильно понимаю, предназначена для блокирования/разблокирования карты.

Да, для блокирования-разблокирования. Но, допустим, у Вас есть карта с установленным паролем, и Вы его забыли. Что делать? Выкидывать всю карту? Ж-а-а-а-лко sm.gif Вот поэтому и есть опция ERASE - снимается пароль, а перед этим стираются все данные которые были этим паролем защищены, так сказать карта приводится "к печке" - в некоторое начальное состояние. Кстати, я использовал в тестах стирание через команду CMD42 не потому что "что-то знал", а просто у меня был готовый код и лень было писать процедуры с использованием CMD38.

Цитата(shishka @ May 17 2011, 13:01) *
Установка в этой команде флажка ERASE приведет к тому, что в дальнейшем картой будут блокироваться запросы на стирание.

Хм, а почему Вы так думаете? Я что-то пропустил/недопонял в стандарте?

Цитата(shishka @ May 17 2011, 13:01) *
возможно ли как то хотя бы взглянуть на Ваши условия тестирования и полученные результаты ??? rolleyes.gif

Взглянуть можно на функцию теста - она очень простая. Варьируя число в цикле 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 мс - отпишусь.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 17 2011, 10:44
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 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 мегабайта - это по нынешним временам почти ничего.
Go to the top of the page
 
+Quote Post
shishka
сообщение May 17 2011, 11:53
Сообщение #20





Группа: Новичок
Сообщений: 5
Регистрация: 25-08-09
Пользователь №: 52 030



Спасибо за ответы.

Для VslavX: По поводу команды CMD42 с установленным флагом ERASE - прошу прощения я не корректно перевел спецификацию.
Go to the top of the page
 
+Quote Post
VslavX
сообщение May 17 2011, 14:33
Сообщение #21


embarrassed systems engineer
*****

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



В-общем, проделал я такие тесты:
CODE

Карта Transcend 512M
- подали питание и инициализировали
- выполнили CMD42 с полным стиранием

номер время в дельта
записи микросек номера

- 1 запись на сектор
001099: 167556 +1099
003099: 163378 +2000
005099: 162215 +2000
007099: 164809 +2000
008099: 63701 +1000
009099: 165216 +1000
011099: 163590 +2000
013099: 163729 +2000

- 1 запись на сектор, повтор
001897: 164404 +1897
003897: 164989 +2000
004897: 66539 +1000
005897: 168102 +1000
007897: 166940 +2000
009897: 163613 +2000
011897: 167304 +2000

- 128 записей на сектор
000639: 209017 +639
001150: 211718 +511
001661: 209965 +511
002172: 213462 +511
002683: 209975 +511
002733: 65913 +50
003194: 210256 +461
003705: 212577 +511
004216: 212983 +511
004727: 212452 +511
005238: 210349 +511

- 1 запись на сектор
000158: 211175 +158
000414: 213704 +256
000670: 214446 +256
000926: 213426 +256
001024: 33885 +98
001042: 165776 +18
003042: 167437 +2000
005042: 163185 +2000

- приводим карту "к печке"
- подали питание и инициализировали
- выполнили CMD42 с полным стиранием
- 1 запись на сектор
000599: 64916 +599
001099: 168699 +500
003099: 164326 +2000
005099: 162175 +2000
007099: 164776 +2000
009099: 168463 +2000


Видно что после приведения "к печке" становится лучше (залеты каждые 2000 секторов), но таки "не совсем хорошо" - спорадические задержки остаются. Увы,значит CMD42 - не панацея sad.gif.
Go to the top of the page
 
+Quote Post
shishka
сообщение May 20 2011, 07:48
Сообщение #22





Группа: Новичок
Сообщений: 5
Регистрация: 25-08-09
Пользователь №: 52 030



Ну вот - теперь у Вас почти совсем как и у меня biggrin.gif
Go to the top of the page
 
+Quote Post
*rust*
сообщение Jun 27 2011, 10:54
Сообщение #23


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

Группа: Участник
Сообщений: 109
Регистрация: 19-01-11
Пользователь №: 62 335



В очередной раз убедился, что абсолютно новая карточка с магазина, ведет себя намного лучше прописал 1гиг, по 32кБ каждые 100мС, все нормально, правда у меня есть небольшая буферизация.

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

Как привести карту к первоначальному состоянию?
Go to the top of the page
 
+Quote Post
_3m
сообщение Jun 27 2011, 14:14
Сообщение #24


Знающий
****

Группа: Участник
Сообщений: 745
Регистрация: 28-12-06
Пользователь №: 23 960



Цитата(*rust* @ Jun 27 2011, 14:54) *
Как привести карту к первоначальному состоянию?

А смысл???
Допустим приведете вы карточку к магазинному состоянию (вообще не факт что это в принципе возможно) и что дальше? Повесите в рамочке на стену?
Как только начнете использовать карту - сразу возникнут задержки.
Расчитывайте буфер на указанное в документации время записи до 250мс и будете спать спокойно!


Go to the top of the page
 
+Quote Post
*rust*
сообщение Jun 27 2011, 17:59
Сообщение #25


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

Группа: Участник
Сообщений: 109
Регистрация: 19-01-11
Пользователь №: 62 335



Цитата
Расчитывайте буфер на указанное в документации время записи до 250мс и будете спать спокойно!

Нет возможности сделать такой буфер.
Цитата
Повесите в рамочке на стену?

При чем тут стена? Я же говорю, что новая ведет себя вполне достойно! Если перед каждым использованием проделывать процедуру приведения в первоначальное состояние, меня бы это устроило.

Цитата
Как только начнете использовать карту - сразу возникнут задержки.

Еще раз, на совершенно новой SD-card прописал 1GB, задержек было очень мало и они были короткие, моя буферизация это выравнивала.
Go to the top of the page
 
+Quote Post
Alex11
сообщение Jun 27 2011, 21:43
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 2 106
Регистрация: 23-10-04
Из: С-Петербург
Пользователь №: 965



Есть еще некоторые карточки, которые (даже полностью стертые) не выносят запись малого количества данных. Скорость записи падает ниже указанного класса в разы. Способ борьбы - писать в мультисекторном режиме большими кусками. Тогда задержки становятся нормальными.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 27 2011, 21:53
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(*rust* @ Jun 27 2011, 21:59) *
Нет возможности сделать такой буфер.

Значит нет возможности гарантировать работоспособность системы в любых обстоятельствах.
Можно попробовать ограничить ущерб от этой ошибки в проектировании системы.
Go to the top of the page
 
+Quote Post
bels
сообщение Aug 31 2011, 11:49
Сообщение #28





Группа: Новичок
Сообщений: 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 раза, в виду нагруженности другими задачами) . В результате работы имеем пропуски в записи на карту. Очень хочется решить проблемму имеющимися средствами, и очень не хочется вешать дополнительные внешние буфера памяти (хотя пока и не уверен что это возможно....).

Спасибо!
Go to the top of the page
 
+Quote Post
Lotor
сообщение Sep 1 2011, 05:06
Сообщение #29


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



Цитата(bels @ Aug 31 2011, 15:49) *
и очень не хочется вешать дополнительные внешние буфера памяти

Из собственного опыта записи на SD - советую не надеяться на чудо, а начинать думать, как навесить буфера... wink.gif


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
bels
сообщение Sep 1 2011, 15:37
Сообщение #30





Группа: Новичок
Сообщений: 4
Регистрация: 23-10-08
Пользователь №: 41 123



Цитата(Lotor @ Sep 1 2011, 09:06) *
Из собственного опыта записи на SD - советую не надеяться на чудо, а начинать думать, как навесить буфера... wink.gif


А каков гарантированный минимальный размер этого буфера(ов)?

Немного не по теме... я бы хотел (если это конечно возможно) проконсультироваться более подробно с *Rust*( e-mail или Skype), но когда начинаю пытаться ему сбросить сообщение через форум - система выдает: "...Вам запрещено использовать личные сообщения на форуме...". Простите, но другой возможности как писать сюда у меня просто нету sad.gif(
Модераторы, жду Вашей помощи...

Спасибо!
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 04:35
Рейтинг@Mail.ru


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