VslavX 0 17 мая, 2011 Опубликовано 17 мая, 2011 · Жалоба Так вот у меня возник вопрос к "VslavX" !!! Что это за команда такая предварительного стирания SET_LOCK_UNLOCK, которой Вы пользовались и которая Вам так облегчила жизнь ????? Можете написать ее номер ??? CMD42, с установленным флажком ERASE. По идее - команда обычного стирания (CMD38) тоже должна помочь, но ее я не пробовал. Возможно у Вас в один и тот же сектор пишется несколько раз после стирания (если там файловая система типа FAT, то такое вполне может быть) - поэтому задержки не устранились. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shishka 0 17 мая, 2011 Опубликовано 17 мая, 2011 · Жалоба 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: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VslavX 0 17 мая, 2011 Опубликовано 17 мая, 2011 · Жалоба 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 мс - отпишусь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 67 17 мая, 2011 Опубликовано 17 мая, 2011 · Жалоба Еще что интересно, так это то, что и на зарубежных сайтах не дают четкого ответа откуда возникают это большое "busy time" при мультиблоковой записи и как с ним бороться!!! Откуда берется не пишут, так как это внутренняя кухня производителя (и у каждого своя), и нет нужды знакомить с ней общественность. На деле все и так более-менее понятно: стирание нового блока, перенос данных из частично пустого для подготовки к стиранию и т.п. издержки организации хранения данных в NAND. Бороться нельзя никак, природу не обманешь. Тогда как работают, например, видеокамер, которые используют SD карты ??? неужели у них такой большой внутренний буфер (ОЗУ), что его хватает аж на 250 мс видеопотока (250 мс вроде как заявлено в спецификации). Конечно, используется достаточно большой буфер: 2-4 мегабайта - это по нынешним временам почти ничего. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shishka 0 17 мая, 2011 Опубликовано 17 мая, 2011 · Жалоба Спасибо за ответы. Для VslavX: По поводу команды CMD42 с установленным флагом ERASE - прошу прощения я не корректно перевел спецификацию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VslavX 0 17 мая, 2011 Опубликовано 17 мая, 2011 · Жалоба В-общем, проделал я такие тесты: Карта 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 - не панацея :(. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shishka 0 20 мая, 2011 Опубликовано 20 мая, 2011 · Жалоба Ну вот - теперь у Вас почти совсем как и у меня Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
*rust* 0 27 июня, 2011 Опубликовано 27 июня, 2011 · Жалоба В очередной раз убедился, что абсолютно новая карточка с магазина, ведет себя намного лучше прописал 1гиг, по 32кБ каждые 100мС, все нормально, правда у меня есть небольшая буферизация. Но стоит только начать писать по писанному:) все начинаются сюрпризы с большими задержками. Пробовал разные способы форматирования, даже форматировал прогой от производителя, все равно не достигнул того, что было когда карта была новой. Как привести карту к первоначальному состоянию? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_3m 4 27 июня, 2011 Опубликовано 27 июня, 2011 · Жалоба Как привести карту к первоначальному состоянию? А смысл??? Допустим приведете вы карточку к магазинному состоянию (вообще не факт что это в принципе возможно) и что дальше? Повесите в рамочке на стену? Как только начнете использовать карту - сразу возникнут задержки. Расчитывайте буфер на указанное в документации время записи до 250мс и будете спать спокойно! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
*rust* 0 27 июня, 2011 Опубликовано 27 июня, 2011 · Жалоба Расчитывайте буфер на указанное в документации время записи до 250мс и будете спать спокойно! Нет возможности сделать такой буфер. Повесите в рамочке на стену? При чем тут стена? Я же говорю, что новая ведет себя вполне достойно! Если перед каждым использованием проделывать процедуру приведения в первоначальное состояние, меня бы это устроило. Как только начнете использовать карту - сразу возникнут задержки. Еще раз, на совершенно новой SD-card прописал 1GB, задержек было очень мало и они были короткие, моя буферизация это выравнивала. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex11 3 27 июня, 2011 Опубликовано 27 июня, 2011 · Жалоба Есть еще некоторые карточки, которые (даже полностью стертые) не выносят запись малого количества данных. Скорость записи падает ниже указанного класса в разы. Способ борьбы - писать в мультисекторном режиме большими кусками. Тогда задержки становятся нормальными. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 27 июня, 2011 Опубликовано 27 июня, 2011 · Жалоба Нет возможности сделать такой буфер. Значит нет возможности гарантировать работоспособность системы в любых обстоятельствах. Можно попробовать ограничить ущерб от этой ошибки в проектировании системы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bels 0 31 августа, 2011 Опубликовано 31 августа, 2011 · Жалоба Нет возможности сделать такой буфер. Еще раз, на совершенно новой SD-card прописал 1GB, задержек было очень мало и они были короткие, моя буферизация это выравнивала. *Rust* - в итоге все же было бы очень интересно знать как Вы разрешили свою проблему. Т.е. какой буфер Вы используете (32К) ? Как он устроен? Как кольцевой или обычное карамысло(2 области попеременно заполняемые и соответственно вычитываемые)? Как часто Вы закидываете данные в карту? У моего сотрудника похожая ситуация: ядро: AT91SAM3U4E, происходит опрос датчиков с частотой 2 милисекунды, за этот же период времени необоходимо закинуть на SD карточку 2кбайт данных, используем карамысло - 2 области по 4кбайт каждая (попробуем увеличить буфер, но думаю это возможно не более чем в 2 раза, в виду нагруженности другими задачами) . В результате работы имеем пропуски в записи на карту. Очень хочется решить проблемму имеющимися средствами, и очень не хочется вешать дополнительные внешние буфера памяти (хотя пока и не уверен что это возможно....). Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lotor 0 1 сентября, 2011 Опубликовано 1 сентября, 2011 · Жалоба и очень не хочется вешать дополнительные внешние буфера памяти Из собственного опыта записи на SD - советую не надеяться на чудо, а начинать думать, как навесить буфера... ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bels 0 1 сентября, 2011 Опубликовано 1 сентября, 2011 · Жалоба Из собственного опыта записи на SD - советую не надеяться на чудо, а начинать думать, как навесить буфера... ;) А каков гарантированный минимальный размер этого буфера(ов)? Немного не по теме... я бы хотел (если это конечно возможно) проконсультироваться более подробно с *Rust*( e-mail или Skype), но когда начинаю пытаться ему сбросить сообщение через форум - система выдает: "...Вам запрещено использовать личные сообщения на форуме...". Простите, но другой возможности как писать сюда у меня просто нету :(( Модераторы, жду Вашей помощи... Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться