¿Cómo funcionan las interrupciones del microcontrolador? [duplicar]

1

Estaba leyendo sobre las interrupciones del microcontrolador y cómo funcionan, pero no puedo entender cómo sucede realmente el cambio de contexto. ¿Puede alguien explicármelo en más detalle?

    
pregunta Max

3 respuestas

4

Esta es una pregunta bastante general. Hay muchos más detalles involucrados que esta respuesta general y muchas formas de lograrlo.

Un procesador es un conjunto esencial de registros que ejecutan un programa. Cuando se produce una interrupción, el procesador interrumpe el flujo del programa actual y ejecuta una rutina de servicio de interrupción.

Las primeras instrucciones del ISR empujan el contenido actual de los registros en la pila.

La mitad de la ISR es donde el contexto cambia y los registros se usan para un nuevo propósito. Al ejecutar estas instrucciones, la interrupción debe eliminarse.

Las últimas instrucciones extraen los registros antiguos de la pila. Cuando los registros aparecen, el procesador continúa con el código original, sin saber que el ISR fue revisado.

    
respondido por el StainlessSteelRat
1

Normalmente, un microcontrolador tendrá un registro que observa periódicamente durante su ciclo. Si se establece uno de los bits, almacenará lo que está haciendo y realizará una acción predefinida, es decir, manejará la interrupción.

Entonces, cuando un periférico solicita una interrupción, establecerá un bit específico. Luego, en el siguiente ciclo de instrucciones, el microcontrolador hará una pausa y, dependiendo de la prioridad de la interrupción, la manejará y luego volverá a lo que estaba haciendo.

    
respondido por el crgrace
1

¡Primero que nada, necesitas ver esta imagen!

Entonces, lo que realmente está sucediendo aquí, no hace muchos días comprendí cómo funcionan las interrupciones, quizás no sea un conocimiento profesional sobre interrupciones, pero es suficiente para que usted, como principiante, también las entienda. Imagine que el programa principal se ejecuta todo el tiempo, que definió mientras que (1) el bucle y el código principal se ejecutan infinitas veces.

Antes de que empiecen a funcionar las interrupciones, debes seguir algunos pasos y entenderlos. En los microcontroladores ARM hay un periférico llamado NVIC (Controlador de interrupción vectorial anidada), que funciona por separado del procesador ARM, también hay una tabla llamada Tabla de vectores que apunta a funciones de interrupción (llamadas ISR - Rutinas de servicio de interrupción).

El principio de funcionamiento de la interrupción se basa en algunos eventos, algunos bits (llamados bits de marca) se establecen cuando ocurre algo. Por ejemplo, el carácter recibido del periférico UART, el temporizador que cuenta con 30 ms de caducidad, el botón se presiona, etc.

En la función principal de los microcontroladores ARM hay una función que habilita las interrupciones (requerida) y cuando la función principal que la ejecuta sondea (ingresa) constantemente esa función de interrupción (con la ayuda de Vector Table) y verifica si el indicador significativo los bits se establecen En caso afirmativo, la ejecución del programa principal se detiene, se ejecuta ISR (algún código) y una vez que se completa la rutina, vuelve a la ejecución del programa principal, y luego todo se repite.

La mejor manera de entender cómo funciona es ver un ejemplo de código:

BYTE receive_byte; // Global variable

int main(void) { 
    uart0(); //Initialize UART0 peripheral
    NVIC_EnableIRQ(UART0_IRQn); //Enable UART0 interrupt

    while(1) { // Infinite loop
    } //while
} //main

void receive(void) {
    receive_byte = LPC_UART0->RBR;  
}

void send(void) {
    LPC_UART0->THR = transmit_byte;
}

void UART0_IRQHandler(void) __irq {
    BYTE tip = LPC_UART0->IIR & 0x06; // Masking bits we will check

    if(tip == 0x04)     receive(); //Checks if there is characted received in RBR (Receive Buffer Register - 1B) if yes go to receive(); function
    else if (tip == 0x02)   send(); //Checks if there is characted (1B) in THR (Transmit Holding Register) if yes go to send function           
}

La configuración de interrupciones es casi la misma en todos los microcontroladores, solo los nombres de registro para trabajar con un periférico específico y los registros para trabajar con interrupciones son diferentes.

    
respondido por el Lazar

Lea otras preguntas en las etiquetas