Отключить / включить прерывание (время), когда вход включен / выключен

Будет ли очистка прерывания / прерывания цикла, а затем установка прерывания возобновлять 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 и вернуться к основному выполнению программы, только к более глубокому (с более высоким приоритетом) прерыванию. Посмотрите, что для этого используются вложенные прерывания.

Другие вопросы по тегам