Ejemplo de manejo de interrupciones que subestima los problemas en el Libro Zynq

1

Lo siento por la pregunta básica, pero estoy llegando a / fpga (como un hobby) desde computadoras 'grandes' y tengo problemas para entender el código de ejemplo de Libro Zynq :

void BTN_Intr_Handler(void *InstancePtr)
{
    // Disable GPIO interrupts
    XGpio_InterruptDisable(&BTNInst, BTN_INT);
    // Ignore additional button presses
    if ((XGpio_InterruptGetStatus(&BTNInst) & BTN_INT) !=
            BTN_INT) {
            return;
        }
    btn_value = XGpio_DiscreteRead(&BTNInst, 1);
    // Increment counter based on button value

    led_data = led_data + btn_value;

    XGpio_DiscreteWrite(&LEDInst, 1, led_data);
    (void)XGpio_InterruptClear(&BTNInst, BTN_INT);
    // Enable GPIO interrupts
    XGpio_InterruptEnable(&BTNInst, BTN_INT);
}
  • Espero que para un código tan simple sea solo la mitad superior. Sin embargo, la mitad superior se ejecutaría solo en el modo IRQ con las interrupciones deshabilitadas, por lo que no es necesario deshabilitar las interrupciones. OTOH si estamos en la mitad inferior hay una carrera entre la interrupción del botón y la desactivación de las interrupciones, a menos que lo usemos como exclusión mutua para led_data.
  • De manera similar, ¿por qué si GetStatus devuelve no volvemos a habilitar las interrupciones?
pregunta Maciej Piechotka

0 respuestas

Lea otras preguntas en las etiquetas