У меня небольшой вопрос по поводу 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. Это не обязательно для флагов, которые устанавливаются в обработчике прерывания, когда вы можно просто отключить прерывания во время операции чтения-изменения-записи.
В другом сообщении ничего не упоминается об атомарности, что является причиной этого дизайна.
Рикардо