AVR: indicador de desbordamiento del temporizador en TIFR [duplicado]

Tengo una pequeña duda sobre la TOVnbandera ubicada en el TIFRnregistro.

La hoja de datos dice que si el TCNTncontador se desborda, la TOVnbandera ubicada en el registro TIFRnse establecerá en 1. (en el mismo ciclo de reloj se produjo el desbordamiento).

El código para manejar dicho evento es el siguiente:

/* 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?
}

Pero lo que me confunde es: ¿por qué debo configurar el TOV1bit cuando ya está configurado por hardware? ¿La configuración de la TOV1bandera en TIFR1la mano 1del usuario desactiva la interrupción del temporizador? (¿Incluso si el indicador TOV1 ya está configurado por hardware?)

EDITAR : Encontró la respuesta: ¿ Borrar bits de bandera escribiendo 1?

+1 por marcar tu propia pregunta como duplicada. Eso es lo que yo llamo disciplina. ¡Bien hecho!

Respuestas (1)

El objetivo de escribir 1 para borrar es borrar la bandera atómicamente sin cambiar ninguno de los otros bits. Claro, es posible hacer una lectura-modificación-escritura y borrar un bit de esa manera, pero luego puede sobrescribir un indicador que se configuró en el hardware entre la lectura y la escritura. Dado que no hay razón para establecer el bit desde el software, el flip flop está configurado para que el hardware pueda establecer el bit y el software pueda borrarlo escribiendo 1. Esto no es necesario para las banderas que se establecen en un controlador de interrupción como usted puede simplemente deshabilitar las interrupciones durante la operación de lectura-modificación-escritura.

La otra publicación no menciona nada sobre la atomicidad, que es el razonamiento detrás de este diseño.