Насколько мне помнится, если читать весь поти, то можно уложиться где-то 5 тактов. Но плохо.
Собственно, чтение - 1 такт.
Запись в память - 2 такта (со смещением)
Переход к чтению - 2 такта (если без проверок на окончание)
Код: Выделить всё
loop:
in r16, porta; // Чтение - 1 такт
st y+, r16; // Запись в память - 2 такта
rjmp loop; // Бесконечный цикл - 2 такта.
// Реально, бесконечный цикл. Без проверок и возможности выхода.
Можно чуть дольше, но до конца буфера.
Код: Выделить всё
// Предварительно:
ldi r17, 0x20; // 0x0200 - 1024 байта памяти выделено под буфер захвата. Предполагается, что буфер памяти расположен в адресах 0x0000..0x1F00
loop:
in r16, porta; // Чтение - 1 такт
st y+, r16; // Запись в память - 2 такта
cpse r17, r29; // Сравниваем верхний байт регистра Y - 0x??xx со значением (0x20), установленым ранее. 1 такт, если не совпадает, иначе - 3 такта (инструкция перехода занимает 2 байта).
rjmp loop; // Вернуться обратно на метку - 2 такта.
Итого - 6 тактов на цикл.
Соответственно, второй вариант будет захватывать состояние порта со скоростью (8000000 / 6) = 1'333'333 MSa/s
Естественно, код выше требует некоторых предварительных действий - установку индексного регистра Y перед началом захвата, определением конца буфера захвата (можно установить технически любое значение, но дополнительные проверки только уменьшат скорость выполнения кода).
И, кстати, при такой скорости чтения - у контроллера не останется времени на обработку полученных данных.
Я бы оценил реальную скорость приёма
и обработки в... от силы 100kSa/s.