Одновременная работа двух прерываний

plotter1

✩✩✩✩✩✩✩
24 Ноя 2021
20
1
Скажите, может ли одновременно быть активно 2 прерывания:
C++:
ISR(TIMER1_COMPA_vect)
{
  PINB |= bit(0) | bit(1);
}
ISR (ANALOG_COMP_vect)
{
  tmr0 = micros();
  flag = true;
}
И если да, то что будет когда эти 2 прерывания совпадут?
И ещё, таймер микрос имеет разрешение 4мкс, если прерывание отрабатывает быстрее чем за 4 мкс то таймер не прерывается или смещается на время нахождения в прерывании?
 

poty

★★★★★★✩
19 Фев 2020
3,265
950
может ли одновременно быть активно 2 прерывания
Если под "активно" понимается одновременное выполнение, то нет (есть исключение на многоядерных процессорах, но не уверен, что там можно назначить выполнение прерываний на нужном процессоре).
Если сигнал по двум прерываниям пришёл в одно и то же время, то обрабатывается прерывание, имеющее более высокий приоритет. Второе прерывание будет ожидать условий для своего выполнения. Если при выполнении первого прерывания второе прерывание запрошено ещё раз, сохраняется информация только о последнем требовании, все остальные запросы теряются.
micros() обрабатывается в прерывании таймера 0, т.е. около одного раза в 1 мс, между этими прерываниями идёт опрос счётчика таймера 0 (т.е. отсутствуют прерывания). Потенциально можно использовать micros() внутри другого прерывания, но есть ряд случаев, когда его работа будет некорректной.
 

poty

★★★★★★✩
19 Фев 2020
3,265
950

@plotter1, читайте внимательно:
Счётчик аппаратного таймера работает без прерываний (считает постоянно) стартует с 0 примерно каждые 1мс (в это же время происходит прерывание, инициирующее переменные в micros).
Количество прерываний записывается в одну из переменных, для определения количества микросекунд, которые прошли от момента предыдущего прерывания используется прямое чтение счётчика аппаратного таймера.
 
Изменено:

poty

★★★★★★✩
19 Фев 2020
3,265
950

@Wan-Derer, объяснение на ассемблере - это круто! Но для понимания - крайне важно, пока не поймёшь, как всё это работает на низком уровне, - не сможешь правильно этим пользоваться, здесь я полностью согласен с материалом. Но для новичка, пожалуй, будет слишком мудрёно. Кроме того, есть много общих рассуждений, не подкреплённых никакими примерами.
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,413
978
58
Марий-Эл
@poty, Я тоже был новичком и писал в машинном коде. Да. Вы не ослышались. Из справочника брал код команды и записывал в память. Адреса перехода считал вручную. Такил лаб у нас было штук 5. Только после этого стали писать на АСМе. Так что это не трудности новичка, а желание понять и разобраться.
 

poty

★★★★★★✩
19 Фев 2020
3,265
950

@Эдуард Анисимов, одно дело - изучать язык программирования, другое - работу железа на базе неизвестного языка программирования. В принципе, если первой ссылкой дать основы ассемблера, то - да, материал полезный, что я и отметил.