08.04.2017, 23:46
|
#1
|
Почётный гражданин KAZUS.RU
Регистрация: 25.11.2010
Адрес: г. Дзержинск Нижегородская обл.
Сообщений: 1,727
Сказал спасибо: 130
Сказали Спасибо 1,111 раз(а) в 530 сообщении(ях)
|
Обработка прерываний
Сейчас решил на ночь немного покодить.
И обратил внимание на следующее:
1) У меня в обработчике прерывания с начала идет обработка события, потом снимаю флаг события, разрешая генерацию прерывания.
2) У всех - сначала сброс флага, потом обработчик.
Как правильно?
|
|
|
|
08.04.2017, 23:56
|
#2
|
Почётный гражданин KAZUS.RU
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,731
Сказал спасибо: 2,443
Сказали Спасибо 893 раз(а) в 580 сообщении(ях)
|
Re: Обработка прерываний
Зависит от задачи. Если надо,чтобы вызванное прерывание отработало и никто ему не помешал (другие прерывание),то флаг сбрасывается после того, как оно закончило.
|
|
|
|
09.04.2017, 00:59
|
#3
|
Частый гость
Регистрация: 15.06.2011
Сообщений: 29
Сказал спасибо: 0
Сказали Спасибо 15 раз(а) в 5 сообщении(ях)
|
Re: Обработка прерываний
Сообщение от baiderin
|
Если надо,чтобы вызванное прерывание отработало и никто ему не помешал (другие прерывание),то флаг сбрасывается после того, как оно закончило.
|
Т. е. не будет вызвано вложенное прерывание с большим приоритетом?
|
|
|
|
09.04.2017, 03:10
|
#4
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,258
Сказал спасибо: 11,170
Сказали Спасибо 3,859 раз(а) в 2,929 сообщении(ях)
|
Re: Обработка прерываний
Пётр_В, а если прерывания запрещены, то как в это время что-то может произойти? Исключение NMI, но оно-то не зря не маскируемым называется . Когда разрешите прерывания - тогда и начнётся рекурсия. И о длине стека тоже не мешает помнить - иначе потом придётся очень долго выяснять пичину весёлых глюков при его переполнении .
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
09.04.2017, 03:48
|
#5
|
Вид на жительство
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
|
Re: Обработка прерываний
Сообщение от DanilinSA
|
1) У меня в обработчике прерывания с начала идет обработка события, потом снимаю флаг события, разрешая генерацию прерывания.
|
Вы уверены, что снятием флага события разрешаете генерацию прерывания?
Кстати, некоторые флаги могут сниматься сами - например флаг RXNE снимается чтением из регистра данных USART, или записью нуля на этот флаг. Читайте RM и PM на Ваш микроконтроллер.
Сообщение от Пётр_В
|
Т. е. не будет вызвано вложенное прерывание с большим приоритетом?
|
Нет. Флаг события, вызвавшего прерывание не влияет на порядок вызова прерываний. Стоит он или нет - прерывание с большим приоритетом всё равно будет вызвано. Чтобы никто не мешал - нужно или настраивать все прерывания на один приоритет (в одну группу, но можно в разные подгруппы - они друг друга не перебивают) или глобально запрещать прерывания на нужном участке обработчика.
Флаг события нужно снимать (если он не снимается сам) чтобы при выходе из прерывания не зайти в него сразу же опять по этому событию (которое уже обработано).
Попробую описать свои измышления - почему надо снимать флаги вручную. В AVR, например, событий мало и обычно у каждого есть свой вектор (у USART - три) и поэтому флаг можно аппаратно снимать по факту входа в прерывание по этому вектору. Разработчики воспользовались этим и поэтому в АВРках не надо заботиться о снятии этих флагов, за редким исключением. В STM32 же событий как правило полно и один вектор используется, например, для всех событий модуля USART. Потому просто аппаратно сбрасывать все флаги событий, которые могут вызвать это прерывание, нельзя. Да и во время обработчика они тоже могут выставиться. Наверное ещё и потому что, эти флаги может использовать DMA.
Ну а когда его сбрасывать? Думайте сами исходя из того, что если событие повторится (например придёт ещё один импульс на EXTI) до того как флаг этого события будет сброшен - оно будет скорее всего потеряно.
|
|
|
|
09.04.2017, 06:03
|
#6
|
Гражданин KAZUS.RU
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 341 раз(а) в 202 сообщении(ях)
|
Re: Обработка прерываний
Сообщение от Пётр_В
|
Т. е. не будет вызвано вложенное прерывание с большим приоритетом?
|
Флаг события сбрасывается для того, чтобы предотвратить повторное вхождение в обработчик по выходу из него. На другие прерывания это никак не повлияет. Если возникнет прерывание более высокого уровня, будет вызвано вложенное прерывание.
|
|
|
|
09.04.2017, 06:18
|
#7
|
Гражданин KAZUS.RU
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 341 раз(а) в 202 сообщении(ях)
|
Re: Обработка прерываний
Сообщение от DanilinSA
|
Сейчас решил на ночь немного покодить.
И обратил внимание на следующее:
1) У меня в обработчике прерывания с начала идет обработка события, потом снимаю флаг события, разрешая генерацию прерывания.
2) У всех - сначала сброс флага, потом обработчик.
Как правильно?
|
Вообще-то, без разницы. Но я все-таки сбрасываю флаг сначала, чтобы не забыть сбросить в конце.
|
|
|
|
09.04.2017, 11:54
|
#8
|
Почётный гражданин KAZUS.RU
Регистрация: 25.11.2010
Адрес: г. Дзержинск Нижегородская обл.
Сообщений: 1,727
Сказал спасибо: 130
Сказали Спасибо 1,111 раз(а) в 530 сообщении(ях)
|
Re: Обработка прерываний
В свое время я много кодил для x86. И уже на уровне рефлексов вбито: с начало обработчик, потом разрешение прерываний. Иначе легко можно словить повторный вход в обработчик до окончания работы.
По большому - сейчас пытаюсь получить ответ на вопрос "У STM32 возможен повторный вызов обработчика до момента выхода из обработчика"?
Если "да" - значит повторный вызов возможен и EXTI_PR нужно чистить непосредственно перед выходом.
Если "нет" - значит повторный вызов невозможен и EXTI_PR нужно чистить сразу. Что-бы не пропустить событие.
Плюс встречал сообщения, что у людей были какие-то проблемы при снятии флагов EXTI_PR в конце процедуры обработчика. Правда все ссылка "битые", а потому подробности не нашел.
Глобальное разрешение/запрет не трогаем. Приоритеты - тоже.
Допустим условно - прерывание на ногу. Приходит пакет иголок. Как правильно это отработать?
Последний раз редактировалось DanilinSA; 09.04.2017 в 12:08.
|
|
|
|
09.04.2017, 12:19
|
#9
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
|
Re: Обработка прерываний
Допустим, выполнен вход в обработчик прерывания. Далее, никаких более высокоприоритетных прерываний не наступает. Выполняется код обработчика. Любые возникшие в этот момент прерывания с равным или меньшим приоритетом не будут прерывать текущий обработчик прерывания. Это справедливо и для того же самого прерывания, которое обрабатывается. Если сбросить его флаг в самом начале, то в случае возникновения этого же прерывания еще раз в тот момент, когда находится в обработчике этого же прерывания, новое прерывание от этого же события будет поставлено в очередь ("отложенное", "ожидающее", "pending"). По завершению текущего обработчика произойдет переход к обработке ожидающего прерывания, если оно есть. Опять же, если ожидающих прерываний несколько, то они будут обрабатываться в соответствии с их приоритетами, либо, если приоритеты равные, очередность определяется номерами прерываний.
Прерывание с более высоким приоритетом, разумеется, будет прерывать работу любого менее приоритетного прерывания.
И еще, детектирование прерываний делится на прерывания по уровню и прерывания по перепаду.
Все это описано в "Программинг мануале" на серию.
|
|
|
|
09.04.2017, 12:44
|
#10
|
Почётный гражданин KAZUS.RU
Регистрация: 24.03.2007
Сообщений: 1,365
Сказал спасибо: 85
Сказали Спасибо 625 раз(а) в 377 сообщении(ях)
|
Re: Обработка прерываний
Сообщение от DanilinSA
|
Плюс встречал сообщения, что у людей были какие-то проблемы при снятии флагов EXTI_PR в конце процедуры обработчика.
|
У меня было подобное, кажется на прерывании от переполнения таймера. Камень F407, прерывание от таймера. При выходе из прерывания в конце сбрасывал флаг и тут же влетал повторно в это же прерывание. Лечилось любой командой после команды сброса флага прерывания, т.е. некоторой задержкой. Либо сбросом флага сразу при входе в прерывание.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:34.
|
|