Отключить / включить прерывание (время), когда вход включен / выключен
Будет ли очистка прерывания / прерывания цикла, а затем установка прерывания возобновлять ISR? Я все еще новичок в форматировании, поэтому я не уверен, что это сделает это.
else if(serial_input == 'p' || serial_input == 'P') {
while(serial_input = fgetc(stdin)) {
if(serial_input == 'p' || serial_input == 'P'){
cli();
break;
}
sei();
}
1 ответ
Имейте в виду, что делают sei() и cli(). cli() глобально устанавливает маску прерывания, эффективно маскируя все входящие прерывания. Все, что нужно будет сделать, это "Защитить" код от прерывания следующего вызова sei(). Все прерывания, полученные в течение этого времени, НЕ будут обрабатываться как прерывания. Фактически, они "игнорируются", пока биты маски установлены. Это простая для чтения справка по прерываниям AVR, в том числе информация о sei() и cli(), а также любая другая информация о прерываниях, о которой я упоминаю ниже.
Вы спрашиваете об остановке и возобновлении ISR, что само по себе является странным вопросом. При обнаружении прерывания ваш текущий процесс останавливается, генерируется новый кадр стека с информацией ISR, и процедура прерывания выполняется до тех пор, пока не встретится возврат из прерывания.
reti()// In AVR-C
Это загружает вашу пользовательскую программу обратно. По сути, не существует (безопасного) способа "приостановить" ISR и вернуться к основному выполнению программы, только к более глубокому (с более высоким приоритетом) прерыванию. Посмотрите, что для этого используются вложенные прерывания.