Но везде в описании reti на AVR говорится, что она аналогична sei; ret;
я допускаю, что так и есть. так же я допускаю, что "индусская" документация не отражает тонкостей ведь очень мало кому взбредет в голову использовать НЕРЕКОМЕНДОВАННЫЕ команды...
кстати, еще вопрос на засыпку: не все команды реализованы в МК разных типов... допустимо ли использование "недопустимых" опкодов?
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Но везде в описании reti на AVR говорится, что она аналогична sei; ret; За исключением, конечно того, что между этими двумя командами не может влезть прерывание. Скорее всего, они как-то одновременно делаются..
Ну, это если их рассматривать в вакууме. А если в программе. Да ещё в режиме когда прерывания постоянно перекрываются по времени (даже не вложенные), когда основному циклу времени не остаётся, как бы. То в случае с reti основной цикл будет работать, хоть и медленно, а в случае с sei+ret - не будет. Объяснение сами найдёте...
_________________ Когда уже ничего не помогает - прочтите, наконец, инструкцию. Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII) Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Так это понятно. ) После выхода из прерывания выполняется минимум одна команда перед следующим прерыванием. Если написать ret+sei, то эта одна команда будет тратиться на sei, а если sei+ret, то у нас получится куча вложенных прерываний и обвал стека с затиранием данных. Поэтому я и говорю, что они как-то одновременно должны делаться.
Неа, не так! Садись - два. Не читал спецификацию! Хотя бы описание команды sei прочитай. ...и стек не обвалится.
Добавил. И не ret+sei, а sei+ret. Тоже мне знаток
_________________ Когда уже ничего не помогает - прочтите, наконец, инструкцию. Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII) Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Правильно. И всё. В случае ret+sei, ты sei куда будешь ставить? В основной программе место будешь угадывать? ret что делает? Если sei+ret, то после sei выполниться ret - из стека адрес достанется, только команда по этому адресу не выполниться. Так что стек не упадёт.
_________________ Когда уже ничего не помогает - прочтите, наконец, инструкцию. Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII) Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
В случае ret+sei, ты sei куда будешь ставить? В основной программе место будешь угадывать? ret что делает?
А мож у меня фон
Код:
main: sei; rjmp main;
Сенсей, а подскажите, в соседнем топике про ФИШКИ сколько все-таки тактов команда LD. Меня терзают смутные сомненья... ))) Что-то накошачили в описании команд...
прочитал, ничего не понял в глюк исполнения ядром МК каких-то команд не верю... но вот какой вопрос снова возник у меня (ранее я над этим думал сам, но тестировать было лень) - кто-нибудь знает ответ на конкретный вопрос: существует ли в AVR разница между reti и sei; ret ? соответственно, обратный вопрос: допустимо ли использовать reti вместо ret в обычных подпрограммах, если состояние флага i безразлично или как раз должно устанавливаться?
что-то мне сильно-сильно кажется, что использование "хакерских" приемов с reti тогда, когда не надо, выбивает микропрограммный автомат МК у топикстартера - оттуда и все его "загадочные" проблемы.
почему я об этом подумал? например, потому, что в доках на семейство MCS51 написано, что команда возврата из прерывания не аналогична команде возврата из подпрограммы с установкой разрешения прерываний, т.к. помимо установки флага она еще "приводит в чувство" блк контроллера прерываний. правда, есть одно но: у MCS51 система прерываний с приоритетами, а у AVR - без них, поэтому, возможно, "приведение в чувтсво" и не потребуется - но кто уверен в этом на 100%? я - нет.
Все зависит скорее всего от последовательности выполнения команд в алгоритме - ведь после реконструкции из алгоритма для MCS51 прога пошла работать нормально следовательно правильность применения команд возврата/разрешения прерываний подтверждена практикой. Кстати и в алгоритмах viewtopic.php?f=62&t=94201 я также подобные приемы использую. Да и пошаговая трассировка всего модуля ничего не обнаружила - глючек только в железе, причем от МК к МК на разных комбинациях выводов, но весьма устойчивая повторяемость той комбинации на каждом кристалле - как сигнатура МК. Чую, что где-то оченно тонкий глюк на попадании прерывания на многоцикловую команду, неотлавливаемую дебаггером, а значит не определенную как критическая ситуация разработчиком. Но глубже вникать не стал - ограничился измененным алгоритмом) я и так "наворочал" для бедной тиньки "запредельный" режим по считыванию массива из ПЗУ при одновременно работающем 8-канальном программном ШИМе - совесть иметь надо... А насчет прерываний - АВРка аналогична таковым для Z80, только аппаратных векторов поболе, а выборка приоритетов весьма подобна.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения