ФИШКИ программирования.

Обсуждаем контроллеры компании Atmel.
Ответить
Мудрый кот
Аватара пользователя
Сообщения: 1811
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

ИС-пытатель, может где-то в спецификациях и есть ошибки. На сколько мне известно, на обычных AVR-ках команда LD отрабатывает за 2 такта. При доступе во внешнюю RAM (на больших мегах) за 3 такта. На ATtiny10 (может ещё на каких-то, не знаю) за 1 такт.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

А какой будет дословный перевод приведенного выше фрагмента? Что-то перемудрено там.
Cycles: (i) 1(2)
(ii) 2
(iii) 3(2)
Здесь указывают 2 такта, а в словесном описани речь идет о каком-то одном такте..
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15752
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Если смотреть хелп по командам от avr studio 4.19, то для "типовых" МК там 2 цикла, для группы xmega 1/2 и для группы avr8l также 1/2.
Вопрос, что там под avr8l подразумевается - просто все кристаллы с индексом L или семейство attiny 4-5-9-10/20? 8)
Хоша, ежли честно, то два цикла или один - не столь уж и важно - все равно поток данных идет по принципу пересылок " чтение-обработка-запись", выигрыш по сравнению с аналогом только за счет высокой тактовой. Даже если брать 51-ю то там "прямой обработке" доступно всего 128 байт, у среднемладших ПИКов - все имеющееся ОЗУ (но частота пониже - там свои хитрости) и лишь у "классики" видв I8080/Z80/I8086 полное "общение" с любой ячейкой ОЗУ.
:tea:
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

Это все хорошо. )) Хочу полностью в этой разобраться ерундовине. )
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 15752
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Тогда покопайтесь в архивах документации Атмел (или свяжитесь с разработчиками)
:beer:
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1811
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

ИС-пытатель, буковки i в скобочках обозначают тип инструкции, которые указаны при первом их (буковок) упоминании в описании инструкции LD. Это, типа, римские цифры, что ли.
Сноску 2 можно перевести так:
Инструкция LD может загружать данные из памяти программ если флэш-память отображена в память данных. Загрузка данных из памяти данных занимает 1 цикл, а загрузка из памяти программ занимает 2 цикла. Если же происходит прерывание (до последнего цикла), то при загрузке из памяти программ дополнительных циклов не требуется. Следовательно, инструкция занимает 1 цикл.

Инструкция LD с пре-декрементом может загружать данные из памяти программ если флэш-память отображена в память данных. Загрузка данных из памяти данных занимает 2 цикл, а загрузка из памяти программ занимает 3 цикла. Если же происходит прерывание (до последнего цикла), то при загрузке из памяти программ дополнительных циклов не требуется. Следовательно, инструкция занимает 1 цикл.
Ограничимся обычными AVR-ками, где есть инструкция LPM и, соответственно, нет отображения памяти программ в область памяти данных. Тогда выполнение
LD Rd, X займёт 1 цикл,
LD Rd, X+ займёт 2 цикла,
LD Rd, -X займёт 2 цикла.

А можно ещё посмотреть раздел " Instruction Set Summary" в спецификации на конкретную мегу или тини.
А там уже непонятки - все варианты LD занимают 2 цикла (например у меги8).
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15752
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Вот от того-то и вылез интерес - я при проработке системы команд руководствовался описанием команд из
http://www.atmel.com/Images/doc0856.pdf
считая что руководящий материал должен всегда быть верным. НО... Как выше уже указывалось в хелпе по ассемблеру также стоит всегда 2 цикла для "стандартных" МК, да и в блоке ST также постоянно для всех аналогичных случаев 2 цикла.
Хоша что LD rd,x, что ST x,rd технически одна и та же операция. По логике вещей простая пересылка из памяти в регистр по адресу из индекс-указателя (и обратно из регистра в память) должна быть короче аналогичной операции, имеющей постинкремент/преддекремент содержимого указателя. Но положимся на разработчика. Вообще описания МК последних 10 лет подавляют количеством "очепяток"... :cry:
Мудрый кот
Аватара пользователя
Сообщения: 1811
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Остаётся только по таймеру засечь на реальном железе...
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Друг Кота
Аватара пользователя
Сообщения: 15752
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Проще нашкрябать в личном экземпляре документации комментарий "данное утверждение требует перепроверки" (осторожно, возможно минен"). 8)
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

Kavka, спасибо! Вот меня именно перевод вот этого места и смутил, поэтому думал, что ошибся с переводом и не мог разобраться:
Kavka писал(а):Если же происходит прерывание (до последнего цикла), то при загрузке из памяти программ дополнительных циклов не требуется. Следовательно, инструкция занимает 1 цикл
Как такое может быть, что инструкция выполняется за 2 цикла(такта) и каким-то макаром между этими двумя тактами влазит прерывание? И каким макаром команда выполнится быстрее? Единственное объяснение этому так это то, что загрузка из флеш-памяти аналогична двум командам. собственно загрузке и какой нибудь cli. А при входе в прерывание cli автоматически делается, поэтому экономятся такты.
Kavka писал(а):А можно ещё посмотреть раздел " Instruction Set Summary" в спецификации на конкретную мегу или тини.
А там уже непонятки - все варианты LD занимают 2 цикла (например у меги8).
Вот я там и смотрел...
Мудрый кот
Аватара пользователя
Сообщения: 1811
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

ИС-пытатель писал(а):Как такое может быть, что инструкция выполняется за 2 цикла(такта) и каким-то макаром между этими двумя тактами влазит прерывание? И каким макаром команда выполнится быстрее? Единственное объяснение этому так это то, что загрузка из флеш-памяти аналогична двум командам. собственно загрузке и какой нибудь cli. А при входе в прерывание cli автоматически делается, поэтому экономятся такты.
Сброс флага прерывания это настолько мизерная операция, что она делается моментально. А вот загрузка данных из памяти программ это "долгая" операция. Возможно за первый такт загружается адрес, а за второй данные пересылаются из памяти в РОН. Так вот, из-за того, что пересылка данных в РОН не "пересекается" с действиями необходимыми при уходе в прерывание, то эти действия можно выполнить "в фоне" при уходе в то самое прерывание. Вот и получается как бы один такт в натуре, а второй в фоне. Возможно как то так и есть на самом деле.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

Да, скорее всего Вы правы. Хотя, думаю, что там идет не загрузка адреса, а факт самого обращение к FLASH. Ведь это еще нужно согласовать с выборкой команд, чтобы эти две операции не накладывались.
Друг Кота
Аватара пользователя
Сообщения: 15752
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

По крайней мере у АТМЕЛ нет диаграмм реакции ядра на прерывание (аналогично Z80, PIC) потому - это из ряда гаданий.
Но как стандарт во всех МК и МП принято, что многобайтовая инструкция должна быть полностью завершена до входа в прерывание. У АВР команда LD(ST) считывается одним словом - посему никак дробиться не может. Разница только в работе микропрограммного автомата, а как он устроен - токмо производителю ведомо.
Да и "конвеер" предвыборки сбрасывать со счетов нельзя.
8)
Мудрый кот
Аватара пользователя
Сообщения: 1811
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Отчего же!? Не всё так плохо. :)
Реакция на прерывание вполне нормально описана в спецификации. Есть, конечно, неопределённость, но не очень большая.
Собственно вот эта тема и начиналась с того как убрать "дрожание" задержки входа в прерывание.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Друг Кота
Аватара пользователя
Сообщения: 15752
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

У современных МК для подобных тонкостей (джиттеры...) специальных аппаратных модулей понасовано...
Выбирай, чего поинтереснее и поближе к задачке. 8)
А по спецификации рассматриваются только диаграмки по таймерам, и то не столько с точки зрения обработки именно прерывания, сколько с точки зрения объяснения механизмов режимов работы самих таймеров. Ну да и ладно - пока того,что есть впоолне достаточно.
:beer:
Ответить

Вернуться в «AVR»