Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


Закрытая тема
Опции темы
Непрочитано 08.04.2017, 23:46   #1
DanilinSA
Почётный гражданин KAZUS.RU
 
Регистрация: 25.11.2010
Адрес: г. Дзержинск Нижегородская обл.
Сообщений: 1,727
Сказал спасибо: 130
Сказали Спасибо 1,111 раз(а) в 530 сообщении(ях)
DanilinSA на пути к лучшему
По умолчанию Обработка прерываний

Сейчас решил на ночь немного покодить.

И обратил внимание на следующее:
1) У меня в обработчике прерывания с начала идет обработка события, потом снимаю флаг события, разрешая генерацию прерывания.
2) У всех - сначала сброс флага, потом обработчик.

Как правильно?
Реклама:
DanilinSA вне форума  
Непрочитано 08.04.2017, 23:56   #2
baiderin
Почётный гражданин KAZUS.RU
 
Аватар для baiderin
 
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,731
Сказал спасибо: 2,443
Сказали Спасибо 893 раз(а) в 580 сообщении(ях)
baiderin на пути к лучшему
По умолчанию Re: Обработка прерываний

Зависит от задачи. Если надо,чтобы вызванное прерывание отработало и никто ему не помешал (другие прерывание),то флаг сбрасывается после того, как оно закончило.
baiderin вне форума  
Непрочитано 09.04.2017, 00:59   #3
Пётр_В
Частый гость
 
Регистрация: 15.06.2011
Сообщений: 29
Сказал спасибо: 0
Сказали Спасибо 15 раз(а) в 5 сообщении(ях)
Пётр_В на пути к лучшему
По умолчанию Re: Обработка прерываний

Сообщение от baiderin Посмотреть сообщение
Если надо,чтобы вызванное прерывание отработало и никто ему не помешал (другие прерывание),то флаг сбрасывается после того, как оно закончило.
Т. е. не будет вызвано вложенное прерывание с большим приоритетом?
Пётр_В вне форума  
Непрочитано 09.04.2017, 03:10   #4
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,258
Сказал спасибо: 11,170
Сказали Спасибо 3,859 раз(а) в 2,929 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Обработка прерываний

Пётр_В, а если прерывания запрещены, то как в это время что-то может произойти? Исключение NMI, но оно-то не зря не маскируемым называется . Когда разрешите прерывания - тогда и начнётся рекурсия. И о длине стека тоже не мешает помнить - иначе потом придётся очень долго выяснять пичину весёлых глюков при его переполнении .
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
mike-y-k вне форума  
Непрочитано 09.04.2017, 03:48   #5
H4LF
Вид на жительство
 
Аватар для H4LF
 
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
H4LF на пути к лучшему
По умолчанию Re: Обработка прерываний

Сообщение от DanilinSA Посмотреть сообщение
1) У меня в обработчике прерывания с начала идет обработка события, потом снимаю флаг события, разрешая генерацию прерывания.
Вы уверены, что снятием флага события разрешаете генерацию прерывания?
Кстати, некоторые флаги могут сниматься сами - например флаг RXNE снимается чтением из регистра данных USART, или записью нуля на этот флаг. Читайте RM и PM на Ваш микроконтроллер.


Сообщение от Пётр_В Посмотреть сообщение
Т. е. не будет вызвано вложенное прерывание с большим приоритетом?
Нет. Флаг события, вызвавшего прерывание не влияет на порядок вызова прерываний. Стоит он или нет - прерывание с большим приоритетом всё равно будет вызвано. Чтобы никто не мешал - нужно или настраивать все прерывания на один приоритет (в одну группу, но можно в разные подгруппы - они друг друга не перебивают) или глобально запрещать прерывания на нужном участке обработчика.
Флаг события нужно снимать (если он не снимается сам) чтобы при выходе из прерывания не зайти в него сразу же опять по этому событию (которое уже обработано).

Попробую описать свои измышления - почему надо снимать флаги вручную. В AVR, например, событий мало и обычно у каждого есть свой вектор (у USART - три) и поэтому флаг можно аппаратно снимать по факту входа в прерывание по этому вектору. Разработчики воспользовались этим и поэтому в АВРках не надо заботиться о снятии этих флагов, за редким исключением. В STM32 же событий как правило полно и один вектор используется, например, для всех событий модуля USART. Потому просто аппаратно сбрасывать все флаги событий, которые могут вызвать это прерывание, нельзя. Да и во время обработчика они тоже могут выставиться. Наверное ещё и потому что, эти флаги может использовать DMA.

Ну а когда его сбрасывать? Думайте сами исходя из того, что если событие повторится (например придёт ещё один импульс на EXTI) до того как флаг этого события будет сброшен - оно будет скорее всего потеряно.
H4LF вне форума  
Непрочитано 09.04.2017, 06:03   #6
Bill
Гражданин KAZUS.RU
 
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 341 раз(а) в 202 сообщении(ях)
Bill на пути к лучшему
По умолчанию Re: Обработка прерываний

Сообщение от Пётр_В Посмотреть сообщение
Т. е. не будет вызвано вложенное прерывание с большим приоритетом?
Флаг события сбрасывается для того, чтобы предотвратить повторное вхождение в обработчик по выходу из него. На другие прерывания это никак не повлияет. Если возникнет прерывание более высокого уровня, будет вызвано вложенное прерывание.
Bill вне форума  
Непрочитано 09.04.2017, 06:18   #7
Bill
Гражданин KAZUS.RU
 
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 341 раз(а) в 202 сообщении(ях)
Bill на пути к лучшему
По умолчанию Re: Обработка прерываний

Сообщение от DanilinSA Посмотреть сообщение
Сейчас решил на ночь немного покодить.

И обратил внимание на следующее:
1) У меня в обработчике прерывания с начала идет обработка события, потом снимаю флаг события, разрешая генерацию прерывания.
2) У всех - сначала сброс флага, потом обработчик.

Как правильно?
Вообще-то, без разницы. Но я все-таки сбрасываю флаг сначала, чтобы не забыть сбросить в конце.
Bill вне форума  
Непрочитано 09.04.2017, 11:54   #8
DanilinSA
Почётный гражданин KAZUS.RU
 
Регистрация: 25.11.2010
Адрес: г. Дзержинск Нижегородская обл.
Сообщений: 1,727
Сказал спасибо: 130
Сказали Спасибо 1,111 раз(а) в 530 сообщении(ях)
DanilinSA на пути к лучшему
По умолчанию Re: Обработка прерываний

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

По большому - сейчас пытаюсь получить ответ на вопрос "У STM32 возможен повторный вызов обработчика до момента выхода из обработчика"?
Если "да" - значит повторный вызов возможен и EXTI_PR нужно чистить непосредственно перед выходом.
Если "нет" - значит повторный вызов невозможен и EXTI_PR нужно чистить сразу. Что-бы не пропустить событие.

Плюс встречал сообщения, что у людей были какие-то проблемы при снятии флагов EXTI_PR в конце процедуры обработчика. Правда все ссылка "битые", а потому подробности не нашел.

Глобальное разрешение/запрет не трогаем. Приоритеты - тоже.

Допустим условно - прерывание на ногу. Приходит пакет иголок. Как правильно это отработать?

Последний раз редактировалось DanilinSA; 09.04.2017 в 12:08.
DanilinSA вне форума  
Непрочитано 09.04.2017, 12:19   #9
NewWriter
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: Обработка прерываний

Допустим, выполнен вход в обработчик прерывания. Далее, никаких более высокоприоритетных прерываний не наступает. Выполняется код обработчика. Любые возникшие в этот момент прерывания с равным или меньшим приоритетом не будут прерывать текущий обработчик прерывания. Это справедливо и для того же самого прерывания, которое обрабатывается. Если сбросить его флаг в самом начале, то в случае возникновения этого же прерывания еще раз в тот момент, когда находится в обработчике этого же прерывания, новое прерывание от этого же события будет поставлено в очередь ("отложенное", "ожидающее", "pending"). По завершению текущего обработчика произойдет переход к обработке ожидающего прерывания, если оно есть. Опять же, если ожидающих прерываний несколько, то они будут обрабатываться в соответствии с их приоритетами, либо, если приоритеты равные, очередность определяется номерами прерываний.
Прерывание с более высоким приоритетом, разумеется, будет прерывать работу любого менее приоритетного прерывания.
И еще, детектирование прерываний делится на прерывания по уровню и прерывания по перепаду.

Все это описано в "Программинг мануале" на серию.
NewWriter вне форума  
Непрочитано 09.04.2017, 12:44   #10
pambaru
Почётный гражданин KAZUS.RU
 
Регистрация: 24.03.2007
Сообщений: 1,365
Сказал спасибо: 85
Сказали Спасибо 625 раз(а) в 377 сообщении(ях)
pambaru на пути к лучшему
По умолчанию Re: Обработка прерываний

Сообщение от DanilinSA Посмотреть сообщение
Плюс встречал сообщения, что у людей были какие-то проблемы при снятии флагов EXTI_PR в конце процедуры обработчика.
У меня было подобное, кажется на прерывании от переполнения таймера. Камень F407, прерывание от таймера. При выходе из прерывания в конце сбрасывал флаг и тут же влетал повторно в это же прерывание. Лечилось любой командой после команды сброса флага прерывания, т.е. некоторой задержкой. Либо сбросом флага сразу при входе в прерывание.
pambaru на форуме  
Закрытая тема

Закладки


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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обработка одновременных прерываний в STM32 serb-radio ARM 33 30.03.2017 18:37
Обработка прерываний в LPC1114 swat24 Микроконтроллеры, АЦП, память и т.д 7 09.12.2011 01:11
Обработка прерываний UART ADuC7026 korel_one Микроконтроллеры, АЦП, память и т.д 0 01.04.2010 10:44
Обработка нескольких прерываний AVR (вопрос) festoon Микроконтроллеры, АЦП, память и т.д 27 17.11.2008 18:02
Обработка прерываний. Tibo Микроконтроллеры, АЦП, память и т.д 12 13.07.2007 17:22


Часовой пояс GMT +4, время: 19:34.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot