|
|
  |
прерывания, как ведет себя проц, если сразу два прерывания? |
|
|
|
Apr 10 2015, 23:51
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(Метценгерштейн @ Apr 10 2015, 14:41)  возьмем cortex, где есть приоритеты прерываний. Допустим, у нас прерывание от таймера имеет приоритет 3. Выполняет это прерывание. Тут происходит другое прерывание с высшим приоритетом. Он бросает выполнение прерывания, начинает более приоритетное выполнять? Угу. Цитата(Метценгерштейн @ Apr 10 2015, 14:41)  А если во время выполнения приоритетного еще раз возникло прерывание от таймера? Он его проигнорирует или в очередь на выполнение запишет? Если флажок прерывания таймера успел быть очищен до этого, то он опять взведется. Если нет, то прерывание потеряется.
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Apr 11 2015, 03:57
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414

|
Аппаратно сохраняются лишь R0-R3, R12, LR, PC и PSR; остальные регистры, если надо, должен сохранять сам программист (ну или компилятор, если обработчик прерывания пишется на языке высокого уровня). И не обязательно в главном стеке -- сохраняются они в стеке, который был активен на момент прерывания (а это может быть и стек процесса -- это уж как программа написана). Более-менее полная "выжимка" из документации по поводу обработки прерываний имеется здесь. Конечно, всё это расписано в документации, но там разбросано по многим страницам, да ещё часто представлено в виде псевдокода; как по мне, текстовое описание того, что делается, удобней, чем делающий это код. Более приортитетное прерывание прерывает текущий обработчик, если последний не успел поднять свой приоритет (например, вообще запретить прерывания); в таком случае в стеке сохраняются регистры прерванного обработчика. В итоге в стеке (или двух стеках -- первый раз в стеке процесса, дальше -- в главном стеке) регистры могут сохраняться многократно, поэтому надо следить, чтобы его размеры были достаточны.
|
|
|
|
|
Apr 11 2015, 04:46
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414

|
Ну, это уже зависит от логики обработчика прерывания. Новое прерывание может вытеснить уже выполняющийся обработчик лишь в том случае, если приоритет нового выше приоритета обрабатывающегося (точней, приоритет группы -- см. по ссылке, что выше давал, если интересно группирование приоритетов). Соответственно, новое прерывание от источника, обработка предыдущего прерывания для которого ещё не завершилась, не сможет вытеснить уже вызванный обработчик этого прервания. Ну а этот обработчик может в конце сбросить все условия прерывания от данного источника -- тогда новое прерывание не произойдёт вовсе. Но, если ничего такого не делать, то после завершения обработчика он сразу будет вызван повторно для обработки нового запроса, как сказал ViKo.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|