Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прерывания в AT90S8535
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Nik
Поясните начинающему, как будут обрабатываться прерывания от событий 1 (более высокий приоритет) и 2 (более низкий приоритет), если:
1.во время обработки события 1 произойдет событие 2
2.во время обработки события 2 произойдет событие 1
Himer
Наскока помню в AVR нету приоритета прерываний, тебе самому надо разрешать прерывание 1 во время обработки события 2, и запрещать прерывание события 2(ну ето автоматом AVR во время обработки прерываний делает) во время обработки 1 - го.
IgorKossak
Приоритеты прерываний у Atmel AVR означают буквально следующее:
- предположим глобально прерывания запрещены;
- происходят события 1 и 2 в любом порядке;
- разрешаются глобально прерывания;
- первым обрабатывается прерывание от события 1 (более высокий приоритет).
Если глобально превания разрешены изначально и события наступают одновременно (в пределах такта), то картина та же.
При переходе к процедуре обработки прерывания глобально все прерывания запрещяются (независимо от приоритета) и разрешаются при выходе из обработчика автоматически. Если их глобально разрешить инструкцией SEI (внутри обработчика), то произойдёт переход к обработчику любого (независимо от приоритета) прерывания, имеющему место (захваченному) на данный момент.
Nik
спасибо за разъяснения
Пришелец
а может ли при разрешении вложенных прерываний из прерывания вызваться то же самое прерывание котрое в данный момент обрабатывается?

Другими словами надо ли при разрешении разрешении прерываний запрещать обрабатываемое прерывание?

в даташите написано, что флаг вызывающий прерывание сбрасывается аппаратно при выполнении прерывания т.е. в прерывании он видимо уже сброшен и может вновь установится вызвав то же прерывание.
mempfis_
Цитата(Пришелец @ Oct 14 2009, 08:23) *
а может ли при разрешении вложенных прерываний из прерывания вызваться то же самое прерывание котрое в данный момент обрабатывается?


То которое обрабатывается - нет.
Но если будете долго сидеть в обработчике прерывания то возможно наступит такой момент когда выполняться условия для генерации нового этого же прерывания - например ТС0 генерирует прерывание TC0OVF раз в 1мС а вы в прерывании вызываете функцию задержки на 5 мС. Тогда ждите краха системы - возникновение множества вложенных прерываний с переполнением стека smile.gif
Пришелец
непонятно biggrin.gif

в том то и вопрос:

значит может всё-таки

долго и недолго относительные понятия

например если по таймеру прерывания с периодом 64 мкс

на их фоне разрешаются другие прерывания

сейчас прерывания от этого таймера на время обработки его прерывания запрещаю - вот думаю можно ли не запрещать
(если задерживаются некоторые прерывания таймера - некритично)


из Вашего ответа понял, что обработчик таймера может вызваться повторно если его индивидуально не запретить при разрешении всех прерываний
Палыч
Цитата(Пришелец @ Oct 14 2009, 08:45) *
сейчас прерывания от этого таймера на время обработки его прерывания запрещаю - вот думаю можно ли не запрещать
(если задерживаются некоторые прерывания таймера - некритично)
Если в процедуре обработки прерывания разрешены прерывания (флаг I установлен), и возможно условие повторной установки флага обрабатываемого прерывания, то запрет этого конкретного прерывания - обязателен (иначе, процедура обработки прерывания будет прервана и вызвана вновь).
Пришелец
спасибо.

этого ответа и ждал rolleyes.gif
Палыч
Цитата(Пришелец @ Oct 14 2009, 09:08) *
этого ответа и ждал rolleyes.gif
Да, ещё забыл сказать: при таком подходе к обработке прерываний, возможен пропуск прерываний. Например, если флаг прерывания от таймера взводится каждые 10 мс, а процедура обработки прерывания может затянуться на, например, 15 мс, то может случиться, что условие взведения флага произайдет дважды (ведь не факт, что обработка прерывания начнется сразу же, как установится флаг прерывания - прерывания могут быть замаскированны при обработке других прерываний). Наверное, что-то у Вас не в порядке с организацией обработки прерываний, раз приходится так извращаться: разрешать прерывания в процедуре обработки прерывания. Наверное, лучше "перелопатить" программу...
Пришелец
Да это само собой разумеется - пропускаться могут.

насчёт перелопатить - согласен но на арме

авр себя исчерпал

посудите сами

мега32(кварц 14.7456) -
уарт на 115200
два программных уарта 19200 и 9600
вывод звука 16 кгц
интерфейс с точ мемори (эл ключи)
измерение частоты аналоговых сигналов (т.е. постоянно прерывания по окончанию измерения АЦП)
ДТМФ декодер программный
на SPI висят dataflash и fram (постоянный обмен и параллельно считывание звука)

памяти давно не осталось - приходится ужиматься - код переписывать выбрасывать ненужное
а данные засовывать в fram


думаю давно пора менять процессор crying.gif
Ваше мнение?
vvs157
Цитата(Палыч @ Oct 14 2009, 11:19) *
Наверное, что-то у Вас не в порядке с организацией обработки прерываний, раз приходится так извращаться: разрешать прерывания в процедуре обработки прерывания. Наверное, лучше "перелопатить" программу...
В таком подходе нет ничего "некошерного". Если скажем один из ста циклов прерываний должен работать существенно дольше периода следования сигнала прерывания - то такое "длинное" прерывание будет нормально работать и без проблем прерываться на выполнение "короткого" цикла
Александр Куличок
Цитата
думаю давно пора менять процессор
Ваше мнение?

Дело ваше. Мегу 644 не рассматривали? Избавитесь от одного програмного уарта и получите в 2 раза больше флеш и озу на той же печатной плате. Правда, насчет цен на 644 не в курсе. Если сопоставимо по цене с арм, то мега не конкурент.

2 IgorKossak
Цитата
произойдёт переход к обработчику любого (независимо от приоритета) прерывания, имеющему место (захваченному) на данный момент

Откуда такая информация?
То есть, если возникли одновременно 3 прерывания: I1,I2,I3 (расставлены в порядке приоритета), и внутри обработчика I1 разрешить прерывания, то не факт, что I2 будет обработано до I3???
Или Вы имели ввиду то, что после sei может быть вызвано прерывание как с большим, так и с меньшим приоритетом относительно текущего?
IgorKossak
Цитата(Александр Куличок @ Oct 14 2009, 18:53) *
Или Вы имели ввиду то, что после sei может быть вызвано прерывание как с большим, так и с меньшим приоритетом относительно текущего?

Именно это.
vvs157
Цитата(Александр Куличок @ Oct 14 2009, 19:53) *
Или Вы имели ввиду то, что после sei может быть вызвано прерывание как с большим, так и с меньшим приоритетом относительно текущего?
В AVR нет системы приоритетов прерываний в обычном понимании. Есть только приоритет в отработке запросов, которые пришли в течении одного такта.
defunct
Цитата(Пришелец @ Oct 14 2009, 13:25) *
Ваше мнение?

для такого набора как Вы привели, на мой взгляд mega32 - это cranky.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.