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

4

Tengo una pequeña pregunta sobre el indicador TOVn ubicado en el registro TIFRn .

La hoja de datos dice que, si el contador TCNTn se desborda, entonces el indicador TOVn ubicado en el registro TIFRn se 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 bit TOV1 cuando ya está configurado por hardware? ¿La configuración de la bandera TOV1 en TIFR1 a 1 por mano de usuario deshabilita la interrupción del temporizador? (Incluso, si el indicador TOV1 ya está configurado por hardware?)

EDIT : encontró la respuesta: ¿Borrar bits de marca escribiendo 1?

    
pregunta d3L

1 respuesta

2

El punto de escritura 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 una marca que se estableció en el hardware entre la lectura y la escritura. Como no hay ninguna razón para configurar el bit desde el software, el flip flop se configura de modo que el hardware pueda configurar el bit y el software pueda borrarlo escribiendo 1. Esto no es necesario para los indicadores que se configuran en un controlador de interrupción, ya que simplemente puede desactivar 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.

    
respondido por el alex.forencich

Lea otras preguntas en las etiquetas