Вопрос к знатокам, почему не работают 2 прерывания совмесно

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Вопрос к знатокам, почему не работают 2 прерывания совме

Сообщение Z_h_e »

Можно ради интереса и тренировки мозгов подумать как организовать вложенность прерываний на AVR. Хотя на практике это скорее всего будет ни к чему и рисует грабли на горизонте.

Предположим что есть три прерывания. Для примера пускай будут вектора что выложил knyaz*. Int0, ADC и Т0CompB. При том что последний по каким-то соображениям надо обслуживать всегда, даже если находишься в других обработчиках прерывания, а первые два не должны друг друга перебивать.

Думаю обрабтчики должны быть написаны на ассме.

При входе в ADC или INT, после сохранения регистра статуса на стеке, дополнительно скинуть на стек регистры масок прерываний INT и ADC, выключаем маски ADC и INT, после этого разрешить прерывания глобально и далее текст обработчика.

Вроде должно работать, но такое чувство что что-то упустил. При написании проекта на ЯВУ, думается мне что вложенность лучше совсем не делать.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15547
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Вопрос к знатокам, почему не работают 2 прерывания совме

Сообщение BOB51 »

[uquote="ozonn",url="/forum/viewtopic.php?p=3192237#p3192237"][uquote="BOB51",url="/forum/viewtopic.php?p=3192224#p3192224"]Всего - то разрешить вложенные прерывания установкой флага I в SREG сразу за входом в первую из процедур обработки.
8)[/uquote]
флаг I разрешает все прерывания, а не вложенные. В атмеге одноуровневая система прерываний[/uquote]

Вот как раз он и выполняет роль разрешения/запрета -
при входе в любое прерывание сбрасывается и по RETI восстанавливается АППАРАТНО.
Для разрешения вложенных прерываний этот флаг должен быть установлен программно (SEI) внутри исполнителя того прерывания, которое мы сочтем более "низкоуровневым".
Для атмег/тинек нет аппаратного контроллера приоритета (как в mcs51/PIC18), однако программное обеспечение подобного алгоритма никто не отменял.
8)
Можно еще "позаимствовать" метод определения вектора для прерываний от внешних устройств у Z80 (вектор предоставляет внешнее устройство при том, что используется всего одна линия прерывания для всех имеющихся).
:roll:
Последний раз редактировалось BOB51 Вт сен 26, 2017 09:01:46, всего редактировалось 1 раз.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Вопрос к знатокам, почему не работают 2 прерывания совме

Сообщение Z_h_e »

BOB51 писал(а):Для разрешения вложенных прерываний этот флаг должен быть установлен программно
Нужно не забыть про возможность зациклится в одном прерывании. Или обязательно выключать маску того прерывания в котором находишься или уже слишком точно просчитать все тайминги.

ИМХО: не нужны вложенности на МК где они не предусмотрены.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15547
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Вопрос к знатокам, почему не работают 2 прерывания совме

Сообщение BOB51 »

ДЫК...
Ничего сверхестественного - весьма часто применяемо.
НО... в большинстве случаев...
Это удел ассемблера.
:hunger:
fulky
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Ср сен 13, 2017 05:53:24

Re: Вопрос к знатокам, почему не работают 2 прерывания совме

Сообщение fulky »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3192149#p3192149"]При наличии нескольких необработанных событий МК уйдёт в прерывание с более высоким приоритетом. Обработав его прмется за другое, если конечно за это время опять не произойдёт событие с высоким приоритетом. Как правило обработчик прерывания делается с максимально быстрым кодом.[/uquote]

а что становится с прерываниями с более низким приоритетом, когда они наполовину уже выполнились?? продолжит выполнятся с того места на котором их остановило прерывание с более высоким приоритетом?? или вовсе не выполнится? или выполнится заново после прерывания с высоким приоритетом?
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Вопрос к знатокам, почему не работают 2 прерывания совме

Сообщение akl »

fulky писал(а):

-Контроллер устанавливает флаги требования обработки прерываний независимо от разрешения/запрета их обработки
-Вход в обработчик прерывания выполняется с аппаратным сбросом I-флага
-Выход из обработчика может быть по RETI с аппаратным взводом I-флага или RET без изменения оного.
Вот из этих посылов и будет дальнейшая реакция контроллера, но уже на программном уровне.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Вопрос к знатокам, почему не работают 2 прерывания совме

Сообщение Demiurg »

fulky писал(а):а что становится с прерываниями с более низким приоритетом, когда они наполовину уже выполнились?? продолжит выполнятся с того места на котором их остановило прерывание с более высоким приоритетом?? или вовсе не выполнится? или выполнится заново после прерывания с высоким приоритетом?

При входе в любое прерывание аппаратно сбрасывается флаг I. Это значит, что любое прерывание будет выполняться от и до, если в обработчике прерывания программист выставляет флаг I, то выполнится то прерывание, которое сработало и программа вернется обратно.
Приоритет прерывания означает, что если вдруг какие-то прерывания сработали одновременно (события), к примеру, переполнение таймера и внешнее прерывание, то первым выполнится прерывание с наименьшим адресом вектора.
Аватара пользователя
knyaz*
Грызет канифоль
Сообщения: 255
Зарегистрирован: Пн фев 11, 2008 20:32:45
Откуда: Краснодарский край

Re: Вопрос к знатокам, почему не работают 2 прерывания совме

Сообщение knyaz* »

fulky писал(а):а что становится с прерываниями с более низким приоритетом, когда они наполовину уже выполнились?? продолжит выполнятся с того места на котором их остановило прерывание с более высоким приоритетом?? или вовсе не выполнится? или выполнится заново после прерывания с высоким приоритетом?

Когда происходит прерывание, то ядро контроллера запоминает текущий адрес в стеке и делает прыжок на адрес вектора соответствующего прерывания.
Когда процессор уходит на обработку прерывания, то аппаратно происходит запрет всех остальных прерываний.
Прерывание можно включить программно, установив флаг I в регистре SREG и тогда у нас будут вложенные прерывания.
Но с эти нужно быть очень аккуратным, особенно если программировать на высокоуровневом языке.
После выхода из обработчика, флаг I вернется.
Если во время обработки одного прерывания придет другое, у него взведется флаг и как только мы завершим первый обработчик автоматом произойдет переход к отложенному прерыванию.
И все отложенные прерывания будут выполняться в соответствии приоритета (таблицу я выложил).
Ах да если будет несколько однотипных прерываний, например при выполнении обработчика произойдет три внешних прерывания, программа будет знать только об последние.
Ну как то так, если в чем то не прав поправьте.
fulky
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Ср сен 13, 2017 05:53:24

Re: Вопрос к знатокам, почему не работают 2 прерывания совме

Сообщение fulky »

[uquote="knyaz*",url="/forum/viewtopic.php?p=3193854#p3193854"]
fulky писал(а):а что становится с прерываниями с более низким приоритетом, когда они наполовину уже выполнились?? продолжит выполнятся с того места на котором их остановило прерывание с более высоким приоритетом?? или вовсе не выполнится? или выполнится заново после прерывания с высоким приоритетом?

Когда происходит прерывание, то ядро контроллера запоминает текущий адрес в стеке и делает прыжок на адрес вектора соответствующего прерывания.
Когда процессор уходит на обработку прерывания, то аппаратно происходит запрет всех остальных прерываний.
Прерывание можно включить программно, установив флаг I в регистре SREG и тогда у нас будут вложенные прерывания.
Но с эти нужно быть очень аккуратным, особенно если программировать на высокоуровневом языке.
После выхода из обработчика, флаг I вернется.
Если во время обработки одного прерывания придет другое, у него взведется флаг и как только мы завершим первый обработчик автоматом произойдет переход к отложенному прерыванию.
И все отложенные прерывания будут выполняться в соответствии приоритета (таблицу я выложил).
Ах да если будет несколько однотипных прерываний, например при выполнении обработчика произойдет три внешних прерывания, программа будет знать только об последние.
Ну как то так, если в чем то не прав поправьте.[/uquote]

Спасибо, теперь всё стало ясно
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Вопрос к знатокам, почему не работают 2 прерывания совме

Сообщение Z_h_e »

knyaz* писал(а):Ну как то так, если в чем то не прав поправьте.

Для программирования на ЯВУ может и достаточно такого объяснения.Но лучше понимать аппаратную реализацию работу прерываний.

Собственно тут уже все написали, но и я напишу. По большому счету повторюсь, что уже написано.
•контроллер не знает и не будет знать какую часть программы выполняет, основной ли это цикл или обработчик прерывания. Ему все равно, берет очередную инструкцию на которую указывает счетчик программ и выполняет.
•флаг события при возникновении соответствующего события устанавливается всегда, вне зависимости он настроек МК, разве что соответствующий модуль периферии должен быть включен.
•прерывание возникнет если установлены флаг события, ему соответствующая маска разрешения прерывания и разрешены прерывания глобально. Как только собралась данная комбинация из трех битов, само собой после завершения инструкции которую выполнял,контроллер тут же:
.....сохраняет на стек адрес инструкции которую МК хотел выполнить следующей, если бы не возникло прерывание и уменьшает указатель стека на размер адреса ;
.....запрещает прерывания глобально и в большинстве случаев сбрасывает соответствующий флаг события(в зависимости от вектора прерывания);
.....загружает в программный счетчик адрес вектора прерывания и выбирает оттуда инструкцию, как правило там лежит инструкция безусловного перехода на обработчик прерывания.
.... все это он делает одновременно и если не ошибаюсь, то за 7 тактов (точно не помню)....
.... после этой "встряски" так же весело выполняет инструкции из памяти программ, только уже из другого участка памяти программ и абсолютно "не задумываясь" что куда-то перепрыгнул.

•Весело добежав до инструкции RETI (если такая будет), загрузит программный счетчик со стека адрес возврата, указатель стека вернется как былО, включится разрешение глобальных прерываний. Т.е. по факту вернется к месту, откуда прервался.

Тут кончено лучше на ассме попрогать немного, чтобы прочувствовать как это.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Вопрос к знатокам, почему не работают 2 прерывания совме

Сообщение Demiurg »

RETI - return + установка флага I (interrupt).
RET - return без установки флага I (но и не сброс флага, если он установлен). Бывают ситуации, когда из прерывания нужно выйти, не включая прерывания. Тогда в обработчиках прерываний ставят эту команду.

Компиляторы ЯВУ в обработчиках прерываний автоматом ставят RETI в конце обработчика. Возможно, что есть специальные директивы, указывающие ставить команду RET.

На ассемблере программист сам определяет, как ему быть в тех или иных случаях.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Вопрос к знатокам, почему не работают 2 прерывания совме

Сообщение Z_h_e »

Demiurg писал(а):Возможно, что есть специальные директивы, указывающие ставить команду RET.
Помню что есть макрос прерывания для (gnu-avr) не сохраняющий контент. Кажется есть и макрос возврата по ret, не уверен.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопрос к знатокам, почему не работают 2 прерывания совме

Сообщение ARV »

Z_h_e писал(а):Помню что есть макрос прерывания для (gnu-avr) не сохраняющий контент
такого нет, но есть ISR(VECTOR, ISR_NACKED), что вынуждает программиста написать ВЕСЬ ОБРАБОТЧИК САМОМУ, включая сохранение и восстановление контекста.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Вопрос к знатокам, почему не работают 2 прерывания совме

Сообщение Z_h_e »

Ну значит не совсем верно запомнил из-за невостребованности.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
philosoraptor
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб янв 14, 2012 22:53:50

Re: Вопрос к знатокам, почему не работают 2 прерывания совме

Сообщение philosoraptor »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3192258#p3192258"]Можно ради интереса и тренировки мозгов подумать как организовать вложенность прерываний на AVR.[/uquote]

В AVR GCC какбэ уже есть директива ISR_NOBLOCK. Но пользоваться ей, особенно без опыта, я б не советовал, ибо
на практике это скорее всего будет ни к чему и рисует грабли на горизонте.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: Вопрос к знатокам, почему не работают 2 прерывания совме

Сообщение COKPOWEHEU »

Нет, имеется в виду эмуляция полноценных вложенных прерываний, когда прерывание не вызывается внутри себя же. А то и с приоритетами.
Аватара пользователя
philosoraptor
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб янв 14, 2012 22:53:50

Re: Вопрос к знатокам, почему не работают 2 прерывания совме

Сообщение philosoraptor »

Проблема вложенных прерываний в том, что теряется сам смысл прерываний.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Вопрос к знатокам, почему не работают 2 прерывания совме

Сообщение Z_h_e »

philosoraptor писал(а):Проблема вложенных прерываний в том, что теряется сам смысл прерываний.
???
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
лжетроник
Родился
Сообщения: 2
Зарегистрирован: Пт янв 14, 2022 21:39:43

Re: Вопрос к знатокам, почему не работают 2 прерывания совме

Сообщение лжетроник »

я не программист от слова никак (установщик с 25-летним стажем), но хочу научиться писать и читать в том числе на асях, вопрос - почему не отключать прерывание от порта сразу после сработки и подключать следующий один, два, восэм по алгоритму с такой же обработкой? автосигнализации старых поколений с запуском и множеством входов и выходов построены на 8-битных камушках все, а по откликам Пантеры, Аллигаторы и подобные были на пол-метровую шляпу выше тех же Старлайнов, которые в некоторых ветвях алгоритма думают 3-4 секунды
Аватара пользователя
smacorp
Друг Кота
Сообщения: 3473
Зарегистрирован: Вт окт 22, 2013 04:37:23
Откуда: Казань

Re: Вопрос к знатокам, почему не работают 2 прерывания совме

Сообщение smacorp »

[uquote="лжетроник",url="/forum/viewtopic.php?p=4621192#p4621192"]почему не отключать прерывание от порта сразу после сработки[/uquote]
Так при входе в обработчик прерывания обычно все прерывания с меньшим или равным приоритетом и так запрещаются автоматически.
Или что имеется ввиду?
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com
Ответить

Вернуться в «AVR»