|
Прерывания в Atmel 8535 |
|
|
|
Jun 3 2008, 20:48
|

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

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

Знающий
   
Группа: Свой
Сообщений: 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
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
Jun 7 2008, 07:52
|

Профессионал
    
Группа: Участник
Сообщений: 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 -- флаги в регистре не трогает вообще. Вот именно! А их надо восстанавливать. Что тебе насчитает основная программа, если прерывания будут периодически портить регистр состояния?
|
|
|
|
|
Jun 7 2008, 10:38
|

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

|
Цитата(777777 @ Jun 7 2008, 13:52)  Возвращаться из обработчика по команде RET нельзя! Да, почему нельзя? Если ты пишешь код и четко понимаешь как он исполняется, то какие проблемы? У человека стоит задача __необрабатывать__ второе прерывание, если одновременно пришли "оба-два", или флаг второго прерывания поднялся до окончания обработки первого. Другое дело, что может быть человек не до конца еще понимает ситуацию, что нужно делать, т.е. еще нет четкого понятия как девайс должен работать. Отсюда такие несколько странные условия задачи. Но этот вопрос находится уже в другой плоскости. Я не вижу здесь ни каких проблем. Не традиционный подход? -- Да. Опасные игры с кодом? -- Да. Но если ты четко знаешь, что происходит, то какие проблемы? По моему, здесь как раз и проходит грань между программированием, как "технология", и программированием, как "искусство". А вообще, беспредметно спорить, только время терять.
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
Jun 9 2008, 11:42
|

кекс
     
Группа: Свой
Сообщений: 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)  Вы пишите на ассемблере, отлаживайте. И тогда всё будет нормально, хоть с вложенными прерываниями, хоть с выложенными  И будут преведы, да еще и на ассемблере.  Потом попробуйте к такой программе прилепить новую функциональность. (например еще один протокол обмена). AVR со своим одноуровневым контроллером прерываний избавляет пользователя от множества проблем, бери да спокойно работай. Глубина стека прогнозируемая, overload прогнозируемый и легко расчитываемый. Карандаш в руки - просчитать нагрузку обработчиков прерываний и все - можно спасть спокойно. Неспешно расширять функционал программы не боясь что система загнется (не трогая обработчиков прерываний). почему многие так и рвутся получить проблему (через одно место работая с прерываниями)? А потом эту проблему исправлять опять же через то же самое место?!
|
|
|
|
Сообщений в этой теме
DMD Прерывания в Atmel 8535 Jun 3 2008, 20:48 Qwertty Цитата(DMD @ Jun 4 2008, 00:48) Если было... Jun 3 2008, 21:17 smac Цитата(Qwertty @ Jun 4 2008, 01:17) Это п... Jun 6 2008, 12:23  Т.Достоевский Цитата(smac @ Jun 6 2008, 16:23) ... в ко... Jun 6 2008, 20:01 777777 Цитата(Qwertty @ Jun 4 2008, 01:17) Возмо... Jun 7 2008, 04:00 artemm Цитата(Qwertty @ Jun 4 2008, 00:17) Возмо... Jun 9 2008, 05:56  Maik-vs Цитата(artemm @ Jun 9 2008, 09:56) Если р... Jun 9 2008, 09:31  alx2 Цитата(artemm @ Jun 9 2008, 10:56) Если р... Jun 9 2008, 20:28 dENIM Цитата(DMD @ Jun 4 2008, 01:24) А есть во... Jun 3 2008, 23:27    777777 Цитата(zhevak @ Jun 7 2008, 14:38) Я не в... Jun 9 2008, 04:29     zhevak Цитата(777777 @ Jun 9 2008, 10:29) Пробле... Jun 9 2008, 06:43     Maik-vs Цитата(defunct @ Jun 9 2008, 15:42) И буд... Jun 10 2008, 12:39      defunct Цитата(Maik-vs @ Jun 10 2008, 15:39)... Jun 10 2008, 14:22       galjoen Цитата(defunct @ Jun 10 2008, 18:22) На а... Jun 10 2008, 15:17        777777 Цитата(galjoen @ Jun 10 2008, 19:17) А я ... Jun 11 2008, 05:51         galjoen Цитата(777777 @ Jun 11 2008, 09:51) Вмест... Jun 11 2008, 14:56       Maik-vs Вот оно, ключевое слово:
Цитата(defunct @ Jun... Jun 12 2008, 11:11        defunct Цитата(Maik-vs @ Jun 12 2008, 14:11)... Jun 12 2008, 18:49         sKWO Цитата(defunct @ Jun 12 2008, 22:49) Если... Jun 13 2008, 10:42         Maik-vs Цитата(defunct @ Jun 12 2008, 22:49) Если... Jun 14 2008, 18:52        sKWO Цитата(Maik-vs @ Jun 12 2008, 15:11)... Jun 15 2008, 09:05 733259 ЦитатаДело в том, что я пишу обработчик и мне надо... Jun 13 2008, 18:09 733259 Не по теме, но не удержался Кодregister uint8_t ... Jun 15 2008, 09:42
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|