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

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

CMD42, с установленным флажком ERASE.

По идее - команда обычного стирания (CMD38) тоже должна помочь, но ее я не пробовал. Возможно у Вас в один и тот же сектор пишется несколько раз после стирания (если там файловая система типа FAT, то такое вполне может быть) - поэтому задержки не устранились.

 

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


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

CMD42, с установленным флажком ERASE.

По идее - команда обычного стирания (CMD38) тоже должна помочь, но ее я не пробовал. Возможно у Вас в один и тот же сектор пишется несколько раз после стирания (если там файловая система типа FAT, то такое вполне может быть) - поэтому задержки не устранились.

 

Спасибо за ответ, но:

1. Команда CMD42, если я все правильно понимаю, предназначена для блокирования/разблокирования карты. Установка в этой команде флажка ERASE приведет к тому, что в дальнейшем картой будут блокироваться запросы на стирание.

2. На данном этапе я просто тестирую карты и еще не использую файловую систему. Результатом тестирования является гисторграмма распределения длительности записи. Запись в моем тесте идет последовательно и адреса наращиваются тоже последовательно. Так вот, тест показал, что при записи 80000 кусков данных (каждый кусок - это 64 блока по 512 байт) или что тоже самое 2.5 Гбайт на SDHC время записи у, примерно, 5-15 кусков превышает 50 мс. в то время как у оставшихся 7995-7985 кусков оно не превышает и 6 мс!!!

3. Использование команды CMD38 не помогло устранить этой проблемы.

 

'VslavX' возможно ли как то хотя бы взглянуть на Ваши условия тестирования и полученные результаты ??? :rolleyes:

 

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

 

Еще раз спасибо 'VslavX' за ответ :laughing:

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


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

1. Команда CMD42, если я все правильно понимаю, предназначена для блокирования/разблокирования карты.

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

 

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

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

 

возможно ли как то хотя бы взглянуть на Ваши условия тестирования и полученные результаты ??? :rolleyes:

Взглянуть можно на функцию теста - она очень простая. Варьируя число в цикле j<128 я пробовал разное количество записей в один и тот же сектор, и выводил к консоль время выполнения операций которые длились более 10мс. Снаружи еще была функция стирания по CMD42 - все эти тестовые функции можно было запускать по клавишам в консоли в произвольном порядке.

Точных результатов, к сожалению, не помню, и этот-то кусочек кода случайно сохранился. Сначала я выводил информацию о времени всех операций в файл - получил представление о среднем времени записи и о спорадических задержках. Потом выполнил CMD42 и увидел что ситуация намного улучшилась если одна запись в один сектор. Ну а потом уже поставил лимит time<10000 - и игрался наблюдая только задержки.

 

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 мс - отпишусь.

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


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

Еще что интересно, так это то, что и на зарубежных сайтах не дают четкого ответа откуда возникают это большое "busy time" при мультиблоковой записи и как с ним бороться!!!

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

Бороться нельзя никак, природу не обманешь.

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

Конечно, используется достаточно большой буфер: 2-4 мегабайта - это по нынешним временам почти ничего.

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


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

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

 

Для VslavX: По поводу команды CMD42 с установленным флагом ERASE - прошу прощения я не корректно перевел спецификацию.

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


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

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

Карта 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 - не панацея :(.

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


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

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

 

Но стоит только начать писать по писанному:) все начинаются сюрпризы с большими задержками.

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

 

Как привести карту к первоначальному состоянию?

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


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

Как привести карту к первоначальному состоянию?

А смысл???

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

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

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

 

 

 

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


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

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

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

Повесите в рамочке на стену?

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

 

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

Еще раз, на совершенно новой SD-card прописал 1GB, задержек было очень мало и они были короткие, моя буферизация это выравнивала.

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


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

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

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


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

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

Значит нет возможности гарантировать работоспособность системы в любых обстоятельствах.

Можно попробовать ограничить ущерб от этой ошибки в проектировании системы.

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


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

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

 

 

 

Еще раз, на совершенно новой SD-card прописал 1GB, задержек было очень мало и они были короткие, моя буферизация это выравнивала.

 

*Rust* - в итоге все же было бы очень интересно знать как Вы разрешили свою проблему. Т.е. какой буфер Вы используете (32К) ? Как он устроен? Как кольцевой или обычное карамысло(2 области попеременно заполняемые и соответственно вычитываемые)? Как часто Вы закидываете данные в карту?

 

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

 

Спасибо!

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


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

и очень не хочется вешать дополнительные внешние буфера памяти

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

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


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

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

 

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

 

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

Модераторы, жду Вашей помощи...

 

Спасибо!

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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