Страница 3 из 3
Re: "убийственный код" или танцы с бубном возле ATtiny2313
Добавлено: Пт апр 18, 2014 18:22:15
ARV
ИС-пытатель писал(а):Но везде в описании reti на AVR говорится, что она аналогична sei; ret;
я допускаю, что так и есть. так же я допускаю, что "индусская" документация не отражает тонкостей

ведь очень мало кому взбредет в голову использовать НЕРЕКОМЕНДОВАННЫЕ команды...
кстати, еще вопрос на засыпку: не все команды реализованы в МК разных типов... допустимо ли использование "недопустимых" опкодов?
Re: "убийственный код" или танцы с бубном возле ATtiny2313
Добавлено: Пт апр 18, 2014 19:34:09
Kavka
ИС-пытатель писал(а):Но везде в описании reti на AVR говорится, что она аналогична sei; ret; За исключением, конечно того, что между этими двумя командами не может влезть прерывание. Скорее всего, они как-то одновременно делаются..
Ну, это если их рассматривать в вакууме.

А если в программе. Да ещё в режиме когда прерывания постоянно перекрываются по времени (даже не вложенные), когда основному циклу времени не остаётся, как бы. То в случае с reti основной цикл будет работать, хоть и медленно, а в случае с sei+ret - не будет. Объяснение сами найдёте...

Re: "убийственный код" или танцы с бубном возле ATtiny2313
Добавлено: Пт апр 18, 2014 19:40:23
ИС-пытатель
Так это понятно. ) После выхода из прерывания выполняется минимум одна команда перед следующим прерыванием. Если написать ret+sei, то эта одна команда будет тратиться на sei, а если sei+ret, то у нас получится куча вложенных прерываний и обвал стека с затиранием данных. Поэтому я и говорю, что они как-то одновременно должны делаться.
Re: "убийственный код" или танцы с бубном возле ATtiny2313
Добавлено: Пт апр 18, 2014 19:49:20
Kavka
Неа, не так! Садись - два.
Не читал спецификацию! Хотя бы описание команды sei прочитай.
...и стек не обвалится.
Добавил.
И не ret+sei, а sei+ret. Тоже мне знаток

Re: "убийственный код" или танцы с бубном возле ATtiny2313
Добавлено: Пт апр 18, 2014 20:01:08
ИС-пытатель
Sets the Global Interrupt Flag (I) in SREG (Status Register). The instruction following SEI will be executed before any pending
interrupts.
А, вот. )) нашел. ))
Узнал много нового!
А почему не будет работать тогда конструкция sei+ret? Точнее, почему не будет выполнятся фоновая программа?
Я ща на STM спецификацию читаю.. Вот там тома... )))
Re: "убийственный код" или танцы с бубном возле ATtiny2313
Добавлено: Пт апр 18, 2014 20:05:36
Kavka
Правильно. И всё.
В случае ret+sei, ты sei куда будешь ставить? В основной программе место будешь угадывать? ret что делает?
Если sei+ret, то после sei выполниться ret - из стека адрес достанется, только команда по этому адресу не выполниться. Так что стек не упадёт.
Re: "убийственный код" или танцы с бубном возле ATtiny2313
Добавлено: Пт апр 18, 2014 20:10:07
ИС-пытатель
Kavka писал(а):В случае ret+sei, ты sei куда будешь ставить? В основной программе место будешь угадывать? ret что делает?
А мож у меня фон
Сенсей, а подскажите, в соседнем топике про ФИШКИ сколько все-таки тактов команда LD. Меня терзают смутные сомненья... ))) Что-то накошачили в описании команд...
Re: "убийственный код" или танцы с бубном возле ATtiny2313
Добавлено: Пт апр 18, 2014 22:05:09
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-канальном программном ШИМе - совесть иметь надо...
А насчет прерываний - АВРка аналогична таковым для Z80, только аппаратных векторов поболе, а выборка приоритетов весьма подобна.
