Просветите нас по приоритетам прерываний на АВР. У них у всех одинаковый приоритет.
Просвещаю. Хоть у AVR-ок и нету такого, как на ББ, контроллера прерываний, с разными уровнями и приоритетом, но при условии одновременного наступления двух и более прерываний, первым обработается прерывание с меньшим номером, остальные будут ожидать.
sadman41 в теории железо может увидеть что прерывание еще не обработано и сохранить второй вызов ...
Например - как оно увидит? И где сохранит? Не на бумажке же запишет, что "два на ум пошло". Думаю, что это частный случай, вполне объяснимый стандартным механизмом установки бита прерываний. Ну, там, INT0 по LOW каждый раз переустанавливается, пока нога на земле.
Я смотрю архитектуру многие вообще не изучают.. Даже если произошел переход по вектору прерывания, это не запрещает другому прерыванию выставить флаг и записать в стек. В итоге после выхода из обработчика переход произойдет опять по вектору прерывания. Перед выходом из обработчика надо сбрасывать флаг прерывания. И в добавок вызывать прерывания программно выставляя состояние пина в коде-полдный долбо...зм.
Флаг сбрасывается при переходе по вектору прерывания. Но не блокируется для установки его вновь пока выполняется обработчик. И даже отключение прерываний при входе в обработчик не припятствует выставлению флага и при включении прерываний этот флаг обработается.
Я смотрю архитектуру многие вообще не изучают.. Даже если произошел переход по вектору прерывания, это не запрещает другому прерыванию выставить флаг и записать в стек.
Хорошо изучил? Или стек это у тебя что то своё, личное?
Вроде и осень кончилась и зима на носу, а дефицит галоперидола ощущается.
-----
Кстати задумался - откуда у всяких "стормов" такие легенды в голове? Про стек отложенных прерываний? Я этот бред не первый раз слышу.
Оговорился, теперь елозить будете до скончания времен. Адреса перехода сохраняются в стек. А флаги прерываний выставляются независимо от того включены они или нет. А снятие глобального флага прерываний 'I' их не сбрасывает. И при поднятии этого флага остальные прочитаются. А в каком порядке это уже вопрос.
Просветите нас по приоритетам прерываний на АВР. У них у всех одинаковый приоритет.
Просвещаю. Хоть у AVR-ок и нету такого, как на ББ, контроллера прерываний, с разными уровнями и приоритетом, но при условии одновременного наступления двух и более прерываний, первым обработается прерывание с меньшим номером, остальные будут ожидать.
У них у всех одинаковый приоритет.
Исполняем на Uno/Nano.
01
//
02
// Проверка последовательности обработки прерываний.
03
// Если в строке №9 написать false, то прерывания будут обрабатываться
04
// немедленно по мере поступления (строки №№ 42-44)
05
// если же в строке №9 написать true, то прерывания будут накапливаться
06
// а обработаются все сразу после того, как будет разрешена их
07
// обработка в строке №47
08
//
09
#define COLLECT_INTERRUPTS true
10
11
static
char
intLog[64];
12
13
// Прерывание INT0
14
void
int0Int(
void
) { strcat(intLog,
"Спартак "
); }
15
16
// Прерывание INT1
17
void
int1Int(
void
) { strcat(intLog,
"разгромил "
); }
18
19
// Прерывание переполнения таймера счётчика 0. Срабатывает один раз
20
ISR (TIMER2_OVF_vect) { TCCR2B = 0; strcat(intLog,
"Реал "
); }
21
22
23
void
setup
(
void
) {
24
intLog[0] =
'\0'
;
25
Serial
.begin(115200);
26
pinMode(2, OUTPUT);
27
pinMode(3, OUTPUT);
28
attachInterrupt(0, int0Int, RISING);
29
attachInterrupt(1, int1Int, RISING);
30
31
#if COLLECT_INTERRUPTS
32
noInterrupts();
33
#endif // COLLECT_INTERRUPTS
34
35
TCCR2A = 0;
36
TCCR2B = 1;
37
TIMSK2 = 1;
38
39
//
40
// Вызываем срабатывание трёх прерываний
41
//
42
_delay_us(100);
43
digitalWrite(3, HIGH);
44
digitalWrite(2, HIGH);
45
46
#if COLLECT_INTERRUPTS
47
interrupts();
48
#endif // COLLECT_INTERRUPTS
49
50
Serial
.println(intLog);
51
}
52
53
void
loop
(
void
) {}
54
55
///////////////////////////////////////
56
//
57
// РЕЗУЛЬТАТ
58
//
59
// (при false в строке №9)
60
// Реал разгромил Спартак
61
//
62
// (при true в строке №9)
63
// Спартак разгромил Реал
64
//
И кто кого? Реал или Спартак?
Инты выше таймеров, посему при накоплении флажков в регистре прерываний первыми будут инты а уже потом таймер.
Дядьки, коль пошла такая пьянка, вопрос: а если несколько событий наступит по одному вектору, флаг сработает единожды ??? Прална ???
А как один бит поднять несколько раз одновременно? Прерывание сработавшее определяется битом регистра, как я помню.
sadman41 в теории железо может увидеть что прерывание еще не обработано и сохранить второй вызов ...
Да
sadman41 в теории железо может увидеть что прерывание еще не обработано и сохранить второй вызов ...
Например - как оно увидит? И где сохранит? Не на бумажке же запишет, что "два на ум пошло". Думаю, что это частный случай, вполне объяснимый стандартным механизмом установки бита прерываний. Ну, там, INT0 по LOW каждый раз переустанавливается, пока нога на земле.
И кто кого? Реал или Спартак?
это понятно! за 100 микросекунд это сколько 62-х наносекундных тиков нащёлкает )))
Я смотрю архитектуру многие вообще не изучают.. Даже если произошел переход по вектору прерывания, это не запрещает другому прерыванию выставить флаг и записать в стек. В итоге после выхода из обработчика переход произойдет опять по вектору прерывания. Перед выходом из обработчика надо сбрасывать флаг прерывания. И в добавок вызывать прерывания программно выставляя состояние пина в коде-полдный долбо...зм.
Флаг сбрасывается при переходе по вектору прерывания. Но не блокируется для установки его вновь пока выполняется обработчик. И даже отключение прерываний при входе в обработчик не припятствует выставлению флага и при включении прерываний этот флаг обработается.
Я смотрю архитектуру многие вообще не изучают.. Даже если произошел переход по вектору прерывания, это не запрещает другому прерыванию выставить флаг и записать в стек.
Хорошо изучил? Или стек это у тебя что то своё, личное?
Перед выходом из обработчика надо сбрасывать флаг прерывания.
А перед тем, как что-то постить - читать документацию. И не забывать принимать таблетки по расписанию.
В стек помещается адрес перехода по инструкции RETI.
Вроде и осень кончилась и зима на носу, а дефицит галоперидола ощущается.
-----
Кстати задумался - откуда у всяких "стормов" такие легенды в голове? Про стек отложенных прерываний? Я этот бред не первый раз слышу.
Это называется "ложная память". Им кажется, что они читали документацию.
Медицине известны такие случаи: https://ru.wikipedia.org/wiki/Парамнезия
Оговорился, теперь елозить будете до скончания времен. Адреса перехода сохраняются в стек. А флаги прерываний выставляются независимо от того включены они или нет. А снятие глобального флага прерываний 'I' их не сбрасывает. И при поднятии этого флага остальные прочитаются. А в каком порядке это уже вопрос.
Адреса перехода сохраняются в стек
А в каком порядке это уже вопрос.
Поизучайте ещё, а то больно много у Вас вопросов осталось. Код мой заодно запустите, посмотрите. Заодно узнаете когда и куда адреса сохраняются.