Перейти к содержанию
    

Поясните начинающему, как будут обрабатываться прерывания от событий 1 (более высокий приоритет) и 2 (более низкий приоритет), если:

1.во время обработки события 1 произойдет событие 2

2.во время обработки события 2 произойдет событие 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Наскока помню в AVR нету приоритета прерываний, тебе самому надо разрешать прерывание 1 во время обработки события 2, и запрещать прерывание события 2(ну ето автоматом AVR во время обработки прерываний делает) во время обработки 1 - го.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приоритеты прерываний у Atmel AVR означают буквально следующее:

- предположим глобально прерывания запрещены;

- происходят события 1 и 2 в любом порядке;

- разрешаются глобально прерывания;

- первым обрабатывается прерывание от события 1 (более высокий приоритет).

Если глобально превания разрешены изначально и события наступают одновременно (в пределах такта), то картина та же.

При переходе к процедуре обработки прерывания глобально все прерывания запрещяются (независимо от приоритета) и разрешаются при выходе из обработчика автоматически. Если их глобально разрешить инструкцией SEI (внутри обработчика), то произойдёт переход к обработчику любого (независимо от приоритета) прерывания, имеющему место (захваченному) на данный момент.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а может ли при разрешении вложенных прерываний из прерывания вызваться то же самое прерывание котрое в данный момент обрабатывается?

 

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

 

в даташите написано, что флаг вызывающий прерывание сбрасывается аппаратно при выполнении прерывания т.е. в прерывании он видимо уже сброшен и может вновь установится вызвав то же прерывание.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а может ли при разрешении вложенных прерываний из прерывания вызваться то же самое прерывание котрое в данный момент обрабатывается?

 

То которое обрабатывается - нет.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

непонятно :biggrin:

 

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

 

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

 

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

 

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

 

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

 

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

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

 

 

из Вашего ответа понял, что обработчик таймера может вызваться повторно если его индивидуально не запретить при разрешении всех прерываний

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Если в процедуре обработки прерывания разрешены прерывания (флаг I установлен), и возможно условие повторной установки флага обрабатываемого прерывания, то запрет этого конкретного прерывания - обязателен (иначе, процедура обработки прерывания будет прервана и вызвана вновь).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да это само собой разумеется - пропускаться могут.

 

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

 

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

 

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

 

мега32(кварц 14.7456) -

уарт на 115200

два программных уарта 19200 и 9600

вывод звука 16 кгц

интерфейс с точ мемори (эл ключи)

измерение частоты аналоговых сигналов (т.е. постоянно прерывания по окончанию измерения АЦП)

ДТМФ декодер программный

на SPI висят dataflash и fram (постоянный обмен и параллельно считывание звука)

 

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

а данные засовывать в fram

 

 

думаю давно пора менять процессор :crying:

Ваше мнение?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Наверное, что-то у Вас не в порядке с организацией обработки прерываний, раз приходится так извращаться: разрешать прерывания в процедуре обработки прерывания. Наверное, лучше "перелопатить" программу...
В таком подходе нет ничего "некошерного". Если скажем один из ста циклов прерываний должен работать существенно дольше периода следования сигнала прерывания - то такое "длинное" прерывание будет нормально работать и без проблем прерываться на выполнение "короткого" цикла

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

думаю давно пора менять процессор

Ваше мнение?

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

 

2 IgorKossak

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

Откуда такая информация?

То есть, если возникли одновременно 3 прерывания: I1,I2,I3 (расставлены в порядке приоритета), и внутри обработчика I1 разрешить прерывания, то не факт, что I2 будет обработано до I3???

Или Вы имели ввиду то, что после sei может быть вызвано прерывание как с большим, так и с меньшим приоритетом относительно текущего?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или Вы имели ввиду то, что после sei может быть вызвано прерывание как с большим, так и с меньшим приоритетом относительно текущего?

Именно это.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или Вы имели ввиду то, что после sei может быть вызвано прерывание как с большим, так и с меньшим приоритетом относительно текущего?
В AVR нет системы приоритетов прерываний в обычном понимании. Есть только приоритет в отработке запросов, которые пришли в течении одного такта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...