Цитата(_Pasha @ Mar 14 2008, 01:22)

Бухгалтерия: продули 5 тактов и два регистра, выиграли 256 байт.
Ессно, без претензий на абсолютную правоту.
У меня тоже предложение, как FLASH сэкономить. В табличном вычислителе ничего не вычислять. А только регистры загружать. Тогда мы в 3 такта проиграем, а в коде 3*256=768 слов выиграем. А в регистрах проиграем т.к. ещё 3 регистра по сравнению с первоначальным вариантом задействовать придётся. Но итог всё равно лучше чем у вас получится - т.к. в тактах проигрыш 3 такта а регистрах всё как и вас (у вас тоже 3 регистра добавилось R0, R1 и регистр =08).
Код
; пишу со вводом в младший байт CRC акк-ра
; R4, R3, R2, ZL - CRC акк-р. R17, R18, R19 - вспомогательные регистры. R16 - принятый байт CRC которого надо подсчитать.
; тут инициализируемся
rjmp Begin; идём в начало цикла
backCRC:
eor ZL,R2; получили новый младший байт обновлённого CRC аккумулятора [1 такт]
mov R2,R17; необходимая пересылка на кот-й теряется 1 такт [1 такт]
eor R2,R3; следующий байт CRC ак-ра [1 такт]
mov R3,R18; необходимая пересылка на кот-й теряется 1 такт [1 такт]
eor R3,R4; следующий байт CRC ак-ра [1 такт]
mov R4,R19; необходимая пересылка на кот-й теряется 1 такт [1 такт]
; итого получили обновлённый CRC32 ак-р, потратив на это 17 тактов.
Begin:; Здесь точка первоначального входа в цикл чтения данных и расчёта их CRC
; Тут получаем данные, для которых собственно и считается CRC32
eor ZL,R16; получили в ZL объединяющую величину [1 такт]
ijmp; переход на таблицу переходов, а оттуда rjmp на наш случай [2+2 такта]
mAF:; сюда попадаем из таблицы переходов по rjmp. Объединяющая величина =AF. Таких кусков кода 256 штук.
ldi ZL,XX1; 1е число табличного вычисления CRC - младший байт[1такт]
ldi R17,XX2; 2е число [1 такт]
ldi R18,XX3; 3е число [1 такт]
ldi R19,XX4; 4е число [1 такт]
rjmp backCRC; регистры загружены - возвращаемся собственно на вычисление [2 такта]
Итог:
1. По сравнению с моим первоначальным вариантом - проигрыш 3 такта =21% быстродействия, 3 регистра, выигрыш на 33% FLASH меньше -1536 вместо 2304 слов в таблицах (+ то, что rjmp везде доставать будет).
2. По сравнению с вашим вариантом - проигрыша ни в чем нет, выигрыш по быстродействию 2 такта =12%, выигрыш по FLASH 20% 1536 вместо 2048 слов в таблицах (+ то, что размещать можно не в начале/конце FLASH).
Если кому интересно - могу и с "классическим" вариантом сравнить (где команды lpm используются).
А у меня - такие чайниковские вопросы по теме:
1. Какое преимущество даст подсчет CRC32 на лету.
2. Какое преимущество увеличение ОЗУ (что такое "дропает").
3. Не будет ли проблем с мак-адресом. В смысле не придётся ли за него кому-нибудь платить.