"убийственный код" или танцы с бубном возле ATtiny2313

Обсуждаем контроллеры компании Atmel.
Ответить
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ИС-пытатель писал(а):Но везде в описании reti на AVR говорится, что она аналогична sei; ret;
я допускаю, что так и есть. так же я допускаю, что "индусская" документация не отражает тонкостей :) ведь очень мало кому взбредет в голову использовать НЕРЕКОМЕНДОВАННЫЕ команды...

кстати, еще вопрос на засыпку: не все команды реализованы в МК разных типов... допустимо ли использование "недопустимых" опкодов?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

Сообщение Kavka »

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

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

Так это понятно. ) После выхода из прерывания выполняется минимум одна команда перед следующим прерыванием. Если написать ret+sei, то эта одна команда будет тратиться на sei, а если sei+ret, то у нас получится куча вложенных прерываний и обвал стека с затиранием данных. Поэтому я и говорю, что они как-то одновременно должны делаться.
Мудрый кот
Аватара пользователя
Сообщения: 1811
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Неа, не так! Садись - два. :)) :)) :))
Не читал спецификацию! Хотя бы описание команды sei прочитай.
...и стек не обвалится.

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

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

Sets the Global Interrupt Flag (I) in SREG (Status Register). The instruction following SEI will be executed before any pending
interrupts.
А, вот. )) нашел. ))

Узнал много нового! :)))

А почему не будет работать тогда конструкция sei+ret? Точнее, почему не будет выполнятся фоновая программа?

Я ща на STM спецификацию читаю.. Вот там тома... )))
Последний раз редактировалось ИС-пытатель Пт апр 18, 2014 20:05:53, всего редактировалось 1 раз.
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1811
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

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

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

Kavka писал(а):В случае ret+sei, ты sei куда будешь ставить? В основной программе место будешь угадывать? ret что делает? :))
А мож у меня фон

Код: Выделить всё

main: sei; 
rjmp main;
:)))

Сенсей, а подскажите, в соседнем топике про ФИШКИ сколько все-таки тактов команда LD. Меня терзают смутные сомненья... ))) Что-то накошачили в описании команд...
Друг Кота
Аватара пользователя
Сообщения: 15751
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

ARV писал(а):прочитал, ничего не понял :) в глюк исполнения ядром МК каких-то команд не верю... но вот какой вопрос снова возник у меня (ранее я над этим думал сам, но тестировать было лень) - кто-нибудь знает ответ на конкретный вопрос: существует ли в AVR разница между reti и sei; ret ? соответственно, обратный вопрос: допустимо ли использовать reti вместо ret в обычных подпрограммах, если состояние флага i безразлично или как раз должно устанавливаться?

что-то мне сильно-сильно кажется, что использование "хакерских" приемов с reti тогда, когда не надо, выбивает микропрограммный автомат МК у топикстартера - оттуда и все его "загадочные" проблемы.

почему я об этом подумал? например, потому, что в доках на семейство MCS51 написано, что команда возврата из прерывания не аналогична команде возврата из подпрограммы с установкой разрешения прерываний, т.к. помимо установки флага она еще "приводит в чувство" блк контроллера прерываний. правда, есть одно но: у MCS51 система прерываний с приоритетами, а у AVR - без них, поэтому, возможно, "приведение в чувтсво" и не потребуется - но кто уверен в этом на 100%? я - нет.
Все зависит скорее всего от последовательности выполнения команд в алгоритме - ведь после реконструкции из алгоритма для MCS51 прога пошла работать нормально следовательно правильность применения команд возврата/разрешения прерываний подтверждена практикой.
Кстати и в алгоритмах http://radiokot.ru/forum/viewtopic.php?f=62&t=94201 я также подобные приемы использую. 8)
Да и пошаговая трассировка всего модуля ничего не обнаружила - глючек только в железе, причем от МК к МК на разных комбинациях выводов, но весьма устойчивая повторяемость той комбинации на каждом кристалле - как сигнатура МК.
Чую, что где-то оченно тонкий глюк на попадании прерывания на многоцикловую команду, неотлавливаемую дебаггером, а значит не определенную как критическая ситуация разработчиком. Но глубже вникать не стал - ограничился измененным алгоритмом) я и так "наворочал" для бедной тиньки "запредельный" режим по считыванию массива из ПЗУ при одновременно работающем 8-канальном программном ШИМе - совесть иметь надо... 8)
А насчет прерываний - АВРка аналогична таковым для Z80, только аппаратных векторов поболе, а выборка приоритетов весьма подобна.
:beer:
Ответить

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