Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Здесь указывают 2 такта, а в словесном описани речь идет о каком-то одном такте..Cycles: (i) 1(2)
(ii) 2
(iii) 3(2)
Ограничимся обычными AVR-ками, где есть инструкция LPM и, соответственно, нет отображения памяти программ в область памяти данных. Тогда выполнениеИнструкция LD может загружать данные из памяти программ если флэш-память отображена в память данных. Загрузка данных из памяти данных занимает 1 цикл, а загрузка из памяти программ занимает 2 цикла. Если же происходит прерывание (до последнего цикла), то при загрузке из памяти программ дополнительных циклов не требуется. Следовательно, инструкция занимает 1 цикл.
Инструкция LD с пре-декрементом может загружать данные из памяти программ если флэш-память отображена в память данных. Загрузка данных из памяти данных занимает 2 цикл, а загрузка из памяти программ занимает 3 цикла. Если же происходит прерывание (до последнего цикла), то при загрузке из памяти программ дополнительных циклов не требуется. Следовательно, инструкция занимает 1 цикл.
Как такое может быть, что инструкция выполняется за 2 цикла(такта) и каким-то макаром между этими двумя тактами влазит прерывание? И каким макаром команда выполнится быстрее? Единственное объяснение этому так это то, что загрузка из флеш-памяти аналогична двум командам. собственно загрузке и какой нибудь cli. А при входе в прерывание cli автоматически делается, поэтому экономятся такты.Kavka писал(а):Если же происходит прерывание (до последнего цикла), то при загрузке из памяти программ дополнительных циклов не требуется. Следовательно, инструкция занимает 1 цикл
Вот я там и смотрел...Kavka писал(а):А можно ещё посмотреть раздел " Instruction Set Summary" в спецификации на конкретную мегу или тини.
А там уже непонятки - все варианты LD занимают 2 цикла (например у меги8).
Сброс флага прерывания это настолько мизерная операция, что она делается моментально. А вот загрузка данных из памяти программ это "долгая" операция. Возможно за первый такт загружается адрес, а за второй данные пересылаются из памяти в РОН. Так вот, из-за того, что пересылка данных в РОН не "пересекается" с действиями необходимыми при уходе в прерывание, то эти действия можно выполнить "в фоне" при уходе в то самое прерывание. Вот и получается как бы один такт в натуре, а второй в фоне. Возможно как то так и есть на самом деле.ИС-пытатель писал(а):Как такое может быть, что инструкция выполняется за 2 цикла(такта) и каким-то макаром между этими двумя тактами влазит прерывание? И каким макаром команда выполнится быстрее? Единственное объяснение этому так это то, что загрузка из флеш-памяти аналогична двум командам. собственно загрузке и какой нибудь cli. А при входе в прерывание cli автоматически делается, поэтому экономятся такты.