реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Прерывания в Atmel 8535
DMD
сообщение Jun 3 2008, 20:48
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 120
Регистрация: 19-02-08
Пользователь №: 35 166



У меня возникла парочка вопросов по прерываниям, смотрел в документации - не нашел. Если сможете - подскажите, пожалуйста.
Как я понял из документации, при входе в обработчик прерывания все остальные прерывания запрещаются, ведь так? То есть неявно выполняется инструкция cli. А что происхоит в случае, если за время обработки происходит внешнее прерывание, INT0, к примеру? Информация о нем отбрасывается или остается где-то? Дело в том, что я пишу обработчик и мне надо знать было ли за время работы обработчика прерывание. Если было, то после выхода вызвать другой обработчик...
И ещё вопрос: как я понял, приоритет у всех внешних прерываний одинаковый, ведь так? А назначить приоритет можно только программно, правда?
Спасибо.


--------------------
Все будет хорошо! Я проверял!
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Jun 3 2008, 21:17
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(DMD @ Jun 4 2008, 00:48) *
Если было, то после выхода вызвать другой обработчик...

Это произойдет само по себе. Сразу после выхода из текущего прерывания.

Цитата(DMD @ Jun 4 2008, 00:48) *
И ещё вопрос: как я понял, приоритет у всех внешних прерываний одинаковый, ведь так? А назначить приоритет можно только программно, правда?
Спасибо.

Приоритетов в АВР нет. Есть псевдоприоритеты - если два прерывания произойдут одновременно, то первым будет обработано то, адрес вектора у которого меньше. Возможно правда сделать вложенные прерывания - вставить sei в обработчик.

Сообщение отредактировал Qwertty - Jun 3 2008, 21:18
Go to the top of the page
 
+Quote Post
DMD
сообщение Jun 3 2008, 22:24
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 120
Регистрация: 19-02-08
Пользователь №: 35 166



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


--------------------
Все будет хорошо! Я проверял!
Go to the top of the page
 
+Quote Post
dENIM
сообщение Jun 3 2008, 23:27
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 226
Регистрация: 13-03-07
Из: Севастополь
Пользователь №: 26 137



Цитата(DMD @ Jun 4 2008, 01:24) *
А есть возможность как-нибудь очистить вот эту очередь прерываний? Я имею ввиду сделать так, чтобы после обработки текущего отложенные прерывания не выполнялись?.. Куда хоть посмотреть можно?

флаги прерываний устанавливаются независимо от того, разрешены глобально прерывания, или нет.
можно контролировать конкретные флаги и обнулять их по необходимости.
Go to the top of the page
 
+Quote Post
zhevak
сообщение Jun 6 2008, 06:11
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(DMD @ Jun 4 2008, 04:24) *
А есть возможность как-нибудь очистить вот эту очередь прерываний? Я имею ввиду сделать так, чтобы после обработки текущего отложенные прерывания не выполнялись?.. Куда хоть посмотреть можно?


Возвращайтесь из обработчика прерывания не по команде RETI, а по команде RET. Разница в том, что RETI насильственно устанавливает флаг I в регистре SREG, а команда RET -- флаги в регистре не трогает вообще. И не забудьте про регистры, которые вы в начале обработчика сохранили в стеке.

А флаги конкретных прерываний (которые имели наглость установиться за это время) снимайте сами, как это посоветовал dENIM.

Сообщение отредактировал zhevak - Jun 6 2008, 06:13


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
smac
сообщение Jun 6 2008, 12:23
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 2-06-08
Из: Москва
Пользователь №: 38 003



Цитата(Qwertty @ Jun 4 2008, 01:17) *
Это произойдет само по себе. Сразу после выхода из текущего прерывания.

Небольшое уточнение, насколько я знаю в контроллерах АВР есть два типа прерываний:
1 флаги которых защелкиваются, после возникновения причин прерываний и сбрасываются либо после перехода по вектору соответствующего прерывания либо программно
2. прерывания, флаги которых действуют только когда присуствтует причина прерываний (по-моему как раз ИНТ0 можно настроить в режим когда флаг прерывания действуе пока на входе соответствующий лог уровень)
Go to the top of the page
 
+Quote Post
fmdost
сообщение Jun 6 2008, 20:01
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Цитата(smac @ Jun 6 2008, 16:23) *
... в контроллерах АВР есть два типа прерываний:
1 флаги которых защелкиваются, после возникновения причин прерываний и сбрасываются либо после перехода по вектору соответствующего прерывания либо программно
2. прерывания, флаги которых действуют только когда присуствтует причина прерываний (по-моему как раз ИНТ0 можно настроить в режим когда флаг прерывания действуе пока на входе соответствующий лог уровень)

Есть ещё флаги которые снимаются только по условию выполнения каких либо действий.
Например флаг UART RTX снимается только если произвести выборку из регистра принятых данных UDR
Go to the top of the page
 
+Quote Post
777777
сообщение Jun 7 2008, 04:00
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(Qwertty @ Jun 4 2008, 01:17) *
Возможно правда сделать вложенные прерывания - вставить sei в обработчик.


Это и делает GNUтый С-компилятор. Кстати, вопрос к знатокам, а можно ли запретить прерывания в обработчике? Т.е. не с помощью вызова cli() в начале, а уговорить компилятор не вставлять там sei.
Go to the top of the page
 
+Quote Post
777777
сообщение Jun 7 2008, 07:52
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(zhevak @ Jun 6 2008, 10:11) *
Возвращайтесь из обработчика прерывания не по команде RETI, а по команде RET.

Возвращаться из обработчика по команде RET нельзя!
Цитата(zhevak @ Jun 6 2008, 10:11) *
Разница в том, что RETI насильственно устанавливает флаг I в регистре SREG, а команда RET -- флаги в регистре не трогает вообще.

Вот именно! А их надо восстанавливать. Что тебе насчитает основная программа, если прерывания будут периодически портить регистр состояния?
Go to the top of the page
 
+Quote Post
zhevak
сообщение Jun 7 2008, 10:38
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(777777 @ Jun 7 2008, 13:52) *
Возвращаться из обработчика по команде RET нельзя!


Да, почему нельзя? Если ты пишешь код и четко понимаешь как он исполняется, то какие проблемы?

У человека стоит задача __необрабатывать__ второе прерывание, если одновременно пришли "оба-два", или флаг второго прерывания поднялся до окончания обработки первого. Другое дело, что может быть человек не до конца еще понимает ситуацию, что нужно делать, т.е. еще нет четкого понятия как девайс должен работать. Отсюда такие несколько странные условия задачи. Но этот вопрос находится уже в другой плоскости.

Я не вижу здесь ни каких проблем. Не традиционный подход? -- Да. Опасные игры с кодом? -- Да. Но если ты четко знаешь, что происходит, то какие проблемы? По моему, здесь как раз и проходит грань между программированием, как "технология", и программированием, как "искусство".


А вообще, беспредметно спорить, только время терять.


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
777777
сообщение Jun 9 2008, 04:29
Сообщение #11


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(zhevak @ Jun 7 2008, 14:38) *
Я не вижу здесь ни каких проблем. Не традиционный подход? -- Да. Опасные игры с кодом? -- Да. Но если ты четко знаешь, что происходит, то какие проблемы? По моему, здесь как раз и проходит грань между программированием, как "технология", и программированием, как "искусство".

Проблема в том, что это только сегодня ты четко знаешь, что происходит, через неделю будешь смутно вспоминать, а через месяц вообще забудешь. А код понадобится модернизировать. А если это будет делать другой программист? Думаешь он разделит твой восторг от отношения к программированию как к искусству? smile.gif А твой работодатель, боюсь, вообще будет категорически против. Потому что ему не видно твоего искусства, он видит только как работает устройство, есть там глюки или нет, и если они есть, то хвалится красотой исходного кода бессмысленно - никто не оценит. Да и пользы от всяких хитроумных трюков обычно никакой нет - даже если экономится 10-20% памяти, все равно оставшуюся неиспользуемую память ты никуда не денешь. И даже когда программа не помещается в памяти, выгоднее вместо ATmega8535 поставить ATmega16, чем мудрить с разного рода программистскими трюками - в конце концов они тебе выйдут боком.
Так что, с точки зрения бизнеса, к программированию надо относиться как к серийному производству, смотреть на устройство глазами пользователя, а не искусствоведа, приходящего в восторг от красиво написанного исходного кода.
Цитата(zhevak @ Jun 7 2008, 14:38) *
А вообще, беспредметно спорить, только время терять.

Ну почему же, спроить всегда полезно, в спорах, как известно, рождается истина.

Сообщение отредактировал 777777 - Jun 9 2008, 04:39
Go to the top of the page
 
+Quote Post
artemm
сообщение Jun 9 2008, 05:56
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 80
Регистрация: 23-07-07
Из: Украина, г. Сумы
Пользователь №: 29 306



Цитата(Qwertty @ Jun 4 2008, 00:17) *
Возможно правда сделать вложенные прерывания - вставить sei в обработчик.

Если разрешить прерывания в обработчике какого-нить прерывания то будет шопопало.
Если в обработчике прерывания I2C разрешить прерывания, то МК зависает. (по крайней мере у меня)
Также в прерывани ком порта будет происходить шопопало. Проверено
Go to the top of the page
 
+Quote Post
zhevak
сообщение Jun 9 2008, 06:43
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(777777 @ Jun 9 2008, 10:29) *
Проблема в том, что это только сегодня ты четко знаешь, что происходит, через неделю будешь смутно вспоминать, а через месяц вообще забудешь...


Да, да, да. Это все так. Только, разумеется, сложные для понимания места обильно комментируем.


Цитата
Так что, с точки зрения бизнеса, к программированию

Точки зрения бывают разные.

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

Мне нужно сделать МК-девайс с потреблением не более 150 мкА. Дело не простое, так как мне нужно получить на УФ-датчике напряжение 300 В. Габарит -- не более размера батарейки "Крона". Питание устройства -- та же "Крона" В. Эти данные привожу, что бы Вы прочувствовали "пресс" требований, которые выдвигает заказчик.) Поэтому мне глубоко наплевать, что код будет не читабельный. Комментарии никто не отменял. Мне нужно обязательно получить результат, а уж как я его добиваюсь, заказчика это не волнует. Деньги он платит не за читабельность кода, а за конечный продукт. Это только один пример. Могу привести другой пример, из своей же практики. Пример, с точностью до наоборот.

Так что, конкретно можно говорить только по конкретной ситуации. Все остальное -- философия.


Цитата
Ну почему же, спроить всегда полезно, в спорах, как известно, рождается истина.

Еще раз: беспредметный спор == потеря времени. Предмета спора у нас нет. (По сути, разговор идет о гипотетическом устройстве и придуманной проге.)


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
Maik-vs
сообщение Jun 9 2008, 09:31
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101



Цитата(artemm @ Jun 9 2008, 09:56) *
Если разрешить прерывания в обработчике какого-нить прерывания то будет шопопало.
Если в обработчике прерывания I2C разрешить прерывания, то МК зависает. (по крайней мере у меня)
Также в прерывани ком порта будет происходить шопопало. Проверено

А у меня не зависает. Проверено.
Вы пишите на ассемблере, отлаживайте. И тогда всё будет нормально, хоть с вложенными прерываниями, хоть с выложенными smile.gif
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 9 2008, 11:42
Сообщение #15


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(zhevak @ Jun 7 2008, 13:38) *
Да, почему нельзя? Если ты пишешь код и четко понимаешь как он исполняется, то какие проблемы?

И превед глюкодром!
Лучше не давать бестолковых советов.

Из обработчика прерывания следует возвращаться командой RETI.


Цитата(DMD @ Jun 4 2008, 01:24) *
А есть возможность как-нибудь очистить вот эту очередь прерываний? Я имею ввиду сделать так, чтобы после обработки текущего отложенные прерывания не выполнялись?.. Куда хоть посмотреть можно?

А вы уверены, что это действительно то, что Вам нужно?
Обработчики прерываний можно сделать максимально короткими, тогда не придется сбрасывать "очереди отложенных прерываний". Все будет успевать отрабатываться как положено.

Например:
прерывание от UART - принять байт, взвести флаг "есть" данные и выйти.
прерывание таймера - увеличить внутренний счетчик (дергуть ногой если надо) и выйти.
прерывание от АЦП - сохранить результат АЦП (переключить на другой канал если требуется) и выйти.
и т.п.

Основную же обработку - вести в основном цикле программы (тобиш в main).

Цитата(Maik-vs @ Jun 9 2008, 12:31) *
Вы пишите на ассемблере, отлаживайте. И тогда всё будет нормально, хоть с вложенными прерываниями, хоть с выложенными smile.gif

И будут преведы, да еще и на ассемблере. smile.gif
Потом попробуйте к такой программе прилепить новую функциональность. (например еще один протокол обмена).

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

почему многие так и рвутся получить проблему (через одно место работая с прерываниями)? А потом эту проблему исправлять опять же через то же самое место?!
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 01:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01795 секунд с 7
ELECTRONIX ©2004-2016