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