Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: прерывания
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Метценгерштейн
возьмем cortex, где есть приоритеты прерываний.
Допустим, у нас прерывание от таймера имеет приоритет 3. Выполняет это прерывание. Тут происходит другое прерывание с высшим приоритетом. Он бросает выполнение прерывания, начинает более приоритетное выполнять?
А если во время выполнения приоритетного еще раз возникло прерывание от таймера? Он его проигнорирует или в очередь на выполнение запишет?
A. Fig Lee
Цитата(Метценгерштейн @ Apr 10 2015, 14:41) *
возьмем cortex, где есть приоритеты прерываний.
Допустим, у нас прерывание от таймера имеет приоритет 3. Выполняет это прерывание. Тут происходит другое прерывание с высшим приоритетом. Он бросает выполнение прерывания, начинает более приоритетное выполнять?

Угу.
Цитата(Метценгерштейн @ Apr 10 2015, 14:41) *
А если во время выполнения приоритетного еще раз возникло прерывание от таймера? Он его проигнорирует или в очередь на выполнение запишет?

Если флажок прерывания таймера успел быть очищен до этого, то он опять взведется. Если нет, то прерывание потеряется.
megajohn
Цитата(A. Fig Lee @ Apr 11 2015, 02:51) *
Угу.

то есть PC,R1-R12 сохраняются в MSP ?
SII
Аппаратно сохраняются лишь R0-R3, R12, LR, PC и PSR; остальные регистры, если надо, должен сохранять сам программист (ну или компилятор, если обработчик прерывания пишется на языке высокого уровня). И не обязательно в главном стеке -- сохраняются они в стеке, который был активен на момент прерывания (а это может быть и стек процесса -- это уж как программа написана). Более-менее полная "выжимка" из документации по поводу обработки прерываний имеется здесь. Конечно, всё это расписано в документации, но там разбросано по многим страницам, да ещё часто представлено в виде псевдокода; как по мне, текстовое описание того, что делается, удобней, чем делающий это код.

Более приортитетное прерывание прерывает текущий обработчик, если последний не успел поднять свой приоритет (например, вообще запретить прерывания); в таком случае в стеке сохраняются регистры прерванного обработчика. В итоге в стеке (или двух стеках -- первый раз в стеке процесса, дальше -- в главном стеке) регистры могут сохраняться многократно, поэтому надо следить, чтобы его размеры были достаточны.
Метценгерштейн
т.е. если выполняется прерывание, возникает более приоритетное, во время его выполнения в стеке сохраняются регистры предыдущего прерывания, возникает еще раз первое прерывание- что произойдет?
ViKo
Цитата(Метценгерштейн @ Apr 11 2015, 07:17) *
т.е. если выполняется прерывание, возникает более приоритетное, во время его выполнения в стеке сохраняются регистры предыдущего прерывания, возникает еще раз первое прерывание- что произойдет?

Взведется pending бит. После окончания обработки низкоприоритетного прерывания оно начнет обрабатываться еще раз.
SII
Ну, это уже зависит от логики обработчика прерывания. Новое прерывание может вытеснить уже выполняющийся обработчик лишь в том случае, если приоритет нового выше приоритета обрабатывающегося (точней, приоритет группы -- см. по ссылке, что выше давал, если интересно группирование приоритетов). Соответственно, новое прерывание от источника, обработка предыдущего прерывания для которого ещё не завершилась, не сможет вытеснить уже вызванный обработчик этого прервания. Ну а этот обработчик может в конце сбросить все условия прерывания от данного источника -- тогда новое прерывание не произойдёт вовсе. Но, если ничего такого не делать, то после завершения обработчика он сразу будет вызван повторно для обработки нового запроса, как сказал ViKo.
Метценгерштейн
усложним задачу- одно прерыв. выполняется, более приоритетное вызвалось. Пока оно выполнялось, еще раз первое вызвалось и т.д. Т.е. реально прерывания больше копятся, чем успевают выполняться. Как -то получится, что стек наползет на область RAM?
adnega
Цитата(Метценгерштейн @ Apr 11 2015, 17:54) *
усложним задачу- одно прерыв. выполняется, более приоритетное вызвалось. Пока оно выполнялось, еще раз первое вызвалось и т.д. Т.е. реально прерывания больше копятся, чем успевают выполняться. Как -то получится, что стек наползет на область RAM?

Вы не понимаете как работают прерывания в Cortex-M. Тема хорошо описана у Дж. Ю. Есть на русском. Советую.
Вкратце: есть разница между запросом прерывания и вызовом обработчика - для вас, похоже, это одно и то же.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.