
Сообщение от
Kulich
Кажется я знаю как работает это копирование, без участия памяти вообще, так-как это тактов 28 на байт из которых in/out 20 съедают точно.
Даже если эту перезапись реализовать сдвигами напрямую из одной карты в другую (по SPI или по полному 4-разрядному интерфейсу SD), то все равно надо много доп.информации передавать каждой из карте для адресации единиц размещения (файловую систему-то она сама по себе не детализирует, а как без ее разбора ?). Но в СМУКе ж и этого нет. Как копировать без участия памяти-то ?
И как за 5 сек вся дискета - разъясните, а то аж уснуть не могу )
Что касается предела скорости обмена, тут Kulich действительно прикинул довольно точно.
Вот такой фрагмент кода читает данные из условного "порта данных" некоей идеализированной железяки, которая в идеальном случае успевает формировать очередной байт данных к каждому новому чтению из порта. После чтения байт сохраняется в буфер в ОЗУ.
Код:
ld hl, srcaddr
ld de, length
ld bc, portaddr
loop: in a, (c) 12T
ld (hl), a 7T
inc hl 6T
dec de 6T
jr nz, loop 12T
На это уходит 43 (то есть даже больше, чем 40) тактов на один цикл (=байт), и это без какой-либо прочей обработки полученных данных и контроля готовности очередных данных перед приемом. 81395 циклов в секунду. Но это "сферический конь в вакууме".
Если в действительности будет даже вдвое меньше, то ~40Кбайт/с при байтном обмене по 8-разрядной шине уже было бы неплохим результатом (~16 сек суммарное время на получение данных всех фрагментов TRD от сервера + обычное суммарное время записи из памяти на флоп с ожиданием позиционирования).
Если бы такое удалось, уже классно. Все зависит действительно от того, насколько хорошо удастся оптимизировать обработку прерывания при обращении к ESP на чтение. Для нас, начинающих, та еще задачка )