Правильно ли использовать бесконечный цикл в прерывании?

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Mytilus G.
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Чт окт 28, 2010 03:49:33
Откуда: откуда все люди родятся

Правильно ли использовать бесконечный цикл в прерывании?

Сообщение Mytilus G. »

Привет!
Во многих учебниках встречаю подобные примеры для ATtiny2313:

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

.cseg
.org 0
rjmp INIT ;обработчик Reset
... ;прочие обработчики
INIT:
  ... ;всякий код
LOOP:
  rjmp LOOP
Получается, при запуске МК будет выполнен rjmp INIT и "... ;всякий код", после чего программа зациклится в LOOP и будет ждать вызова прерывания. Случись прерывание по Reset, и все это будет выполнено снова. Но цикл LOOP будет запущен уже в обработчике прерывания. То есть обработка прерывания Reset зациклится. Не помешает ли это выполнению других прерываний? Ведь, насколько мне известно, прерывания встают в очередь и не выполняются до завершения предыдущих. Не так ли?
Реклама
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Правильно ли использовать бесконечный цикл в прерывании?

Сообщение pyzhman »

Так.
цикл LOOP будет запущен уже в обработчике прерывания
С какого перепуга?
Docendo discimus
Реклама
Аватара пользователя
TRIOD
Вымогатель припоя
Сообщения: 693
Зарегистрирован: Вт сен 15, 2009 16:23:06
Откуда: Москва

Re: Правильно ли использовать бесконечный цикл в прерывании?

Сообщение TRIOD »

Mytilus G.
Контролер будет молотить в цикле пока не случится прырывание в результате мк цикл лоп остановится и контролер прыгнет на обработку прерывания после вернётся обратно где закончил и продолжить молотить в цикле.
Только абсолютная пустота бездны принесёт мне покой.
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: Правильно ли использовать бесконечный цикл в прерывании?

Сообщение Kavka »

Mytilus G., если вы внимательно прочитаете спецификацию на микроконтроллер
, то наверное, заметите, что контроллер при срабатывании сброса делает не только переход по вектору сброса, но и сброс периферии. Учтите, что программа выполняемая по вектору сброса является, скажем так, основной, и в начале инициализирует стек и по своим нуждам (т.е. нуждам программиста) разрешает или запрещает прерывания. Так что то, что в ней будет разрешено, то и будет происходить. Т.е., если разрешить прерывания, то выполнение упомянутого вами бесконечного цикла не будет мешать срабатыванию прерываний и выполнению их обработчиков.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Правильно ли использовать бесконечный цикл в прерывании?

Сообщение ploop »

Так же как и внутри любого другого прерывания можно принудительно разрешить прерывания - получим вложенные прерывания. Но пользоваться этим я не советую без чёткого понимания необходимости данного шага.
Реклама
Mytilus G.
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Чт окт 28, 2010 03:49:33
Откуда: откуда все люди родятся

Re: Правильно ли использовать бесконечный цикл в прерывании?

Сообщение Mytilus G. »

Теперь понял. То есть, если в обработчике прерывания будет инструкция sei, то следующее прерывание будут выполнено немедленно?
Реклама
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Правильно ли использовать бесконечный цикл в прерывании?

Сообщение ploop »

Нет, оно будет выполнено тогда, когда наступит.
Mytilus G.
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Чт окт 28, 2010 03:49:33
Откуда: откуда все люди родятся

Re: Правильно ли использовать бесконечный цикл в прерывании?

Сообщение Mytilus G. »

Спасибо!
Аватара пользователя
demson
IT KT
Сообщения: 1309
Зарегистрирован: Пн авг 25, 2008 08:49:33
Контактная информация:

Re: Правильно ли использовать бесконечный цикл в прерывании?

Сообщение demson »

а разве у авр есть вытеснение в прерываниях по большему приоритету? Обработка да - после отработки этого выберет прерывание с высшим приоритетом, а из прерывания в прерывание прыгать не будет вроде.
в спорах рождается ИСТИНА [AND] flud.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Правильно ли использовать бесконечный цикл в прерывании?

Сообщение ploop »

Нет там никаких приоритетов, разве что по расположению битов в соответствующих регистрах периферии (кажется так было).
а из прерывания в прерывание прыгать не будет вроде.
Да логика там тупая как паровоз: стоит бит "i" в SREG - все прерывания работают, нет так нет. Бит автоматом снимается при срабатывании прерывания (аппаратно) и устанавливается при выходе из обработчика (например reti = sei + ret)
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: Правильно ли использовать бесконечный цикл в прерывании?

Сообщение Kavka »

ploop, неа, приоритеты есть! Например atmega16a. Пункт 6.7 спецификации.
The lowest addresses in the program memory space are by default defined as the Reset and
Interrupt Vectors. The complete list of vectors is shown in “Interrupts” on page 44. The list also
determines the priority levels of the different interrupts. The lower the address the higher is the
priority level
.
При одновременном возникновении событий на прерывание, первым будет обрабатываться то, у которого меньше адрес вектора.
When an interrupt occurs, the Global Interrupt Enable I-bit is cleared and all interrupts are dis-
abled. The user software can write logic one to the I-bit to enable nested interrupts. All enabled
interrupts can then interrupt the current interrupt routine. The I-bit is automatically set when a
Return from Interrupt instruction – RETI – is executed.
При срабатывании прерывания I-флаг будет сброшен (в ноль). При выходе из прерывания I-флаг будет установлен (в единицу). Если в обработчике прерывания не будут разрешены вложенные прерывания, то прерывания с меньшим приоритетом будут обрабатываться после выхода из обработчика.
Последний раз редактировалось Kavka Пн мар 05, 2012 07:23:03, всего редактировалось 1 раз.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Правильно ли использовать бесконечный цикл в прерывании?

Сообщение pyzhman »

С год назад уже спорили. Так никто и не проверил в реале.
Docendo discimus
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Правильно ли использовать бесконечный цикл в прерывании?

Сообщение ploop »

первым будет обрабатываться то, у которого меньше адрес обработчика.
Точнее адрес вектора, если смотреть по вашей цитате.

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

Re: Правильно ли использовать бесконечный цикл в прерывании?

Сообщение Kavka »

ploop, да, вы правы, не точно выразился. (поправил)

pyzhman, проверить, то, проще простого. INT0 и INT1 соединяем, и в прерываниях проверяем кто вперёд пришёл. У кого есть есть на чём проверить? :)
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Правильно ли использовать бесконечный цикл в прерывании?

Сообщение ploop »

Есть 2313 распаянная на макетке. Но дома :)
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»