AVR: флаг переполнения таймера в TIFR [дубликат]

У меня небольшой вопрос по поводу TOVnфлага, находящегося в TIFRnреестре.

В даташите сказано, что если TCNTnсчетчик переполнится, то TOVnфлаг, расположенный в регистре, TIFRnбудет установлен в 1. (на этом же такте произошло переполнение).

Код для обработки такого события следующий:

/* Check if TOV1 flag is set */
if (TIFR1 & _BV(TOV1)) {
    /* Since TOV1 is set, we know we missed an overflow interrupt */

    /* Handle the event... */
    // ... timer_ovf_cnt++;

    /* Prevent ISR to be called, because we already handled the overflow */
    TIFR1 = _BV(TOV1); // .. but TOV1 is already set in TIFR1?
}

Но меня смущает: зачем мне устанавливать TOV1бит, если он уже установлен аппаратно? Отключает ли установка TOV1флага TIFR1вручную прерывание таймера ? (Даже если флаг TOV1 уже установлен аппаратно?)1

РЕДАКТИРОВАТЬ : Нашел ответ: очистка битов флага путем записи 1?

+1 за то, что пометили свой вопрос как дубликат. Вот это я называю дисциплиной. Отличная работа!

Ответы (1)

Смысл записи 1 для очистки состоит в атомарной очистке флага без изменения каких-либо других битов. Конечно, можно выполнить чтение-изменение-запись и очистить один бит таким образом, но тогда вы можете перезаписать флаг, установленный аппаратно между чтением и записью. Поскольку нет необходимости устанавливать бит программно, триггер сконфигурирован так, что аппаратное обеспечение может установить бит, а программное обеспечение может сбросить его, записав 1. Это не обязательно для флагов, которые устанавливаются в обработчике прерывания, когда вы можно просто отключить прерывания во время операции чтения-изменения-записи.

В другом сообщении ничего не упоминается об атомарности, что является причиной этого дизайна.