Análisis del proceso de manejo de interrupciones de una microcomputadora de un solo chip ARM

prefacio

Las interrupciones son muy comunes en el desarrollo de microcontroladores. Por supuesto, conoce muy bien el principio y el proceso de ejecución de las interrupciones, entonces, ¿ha descubierto realmente el comportamiento de procesamiento específico de las interrupciones del microcontrolador ARM?

Hablemos brevemente hoy, cuál es el comportamiento específico en el proceso de procesamiento de interrupciones de la microcomputadora ARM de un solo chip, y descubramos esto, para que pueda comprender completamente cómo se ejecutan las interrupciones.

Después de dominar estos contenidos, puede hacerlo con facilidad cuando encuentre problemas de interrupción en el proceso de desarrollo en el futuro.

Este artículo clasifica principalmente el comportamiento específico del microcontrolador central Cortex-M3 en el manejo de eventos de interrupción y cómo se manejan las diferentes interrupciones.

respuesta de interrupción

Cuando el microcontrolador Cortex-M3 comienza a responder a una interrupción, realizará las siguientes tres operaciones:

  • El registro se empuja a la pila, y el valor del registro se empuja a la pila
  • Obtener vector: averigüe la dirección de entrada del programa de servicio correspondiente de la tabla de vectores
  • Seleccione el puntero de pila MSP/PSP, actualice el puntero de pila SP, actualice el registro de enlace LR y actualice el contador de programa PC

La primera acción para responder a la interrupción es guardar automáticamente las partes necesarias de la escena: xPSR, PC, LR, R12 y R3-R0 se colocan automáticamente en la pila adecuada por medio del hardware.

Al responder a una excepción, el código actual utiliza PSP, luego inserta en PSP, es decir, usa la pila de proceso; de lo contrario, inserta en MSP, usa la pila principal. Una vez que se ingresa la rutina de servicio, siempre se usa la pila principal.

El orden de inserción en la pila y el contenido de la pila después de haber sido introducido en la pila se muestran en la siguiente figura. En el proceso de apilamiento automático, la secuencia temporal de escritura de registros en la memoria de pila no corresponde a la secuencia espacial de escritura . Pero la máquina garantizará: el registro correcto se guardará en la ubicación correcta.

Al guardar primero los valores de PC y xPSR, la precarga de la instrucción de rutina de servicio se puede iniciar antes, ya que esto necesita modificar la PC; al mismo tiempo, el valor del campo de bits IPSR en xPSR se puede actualizar en la etapa temprana

Saque la dirección de la rutina de servicio de interrupción, encuentre el vector de excepción correcto de la tabla de vectores de interrupción y luego busque las instrucciones en la entrada del programa de servicio. Esta parte la realiza el bus de instrucciones (bus I-Code).

Una vez que se completan las operaciones de extracción de pila y vector, antes de ejecutar la rutina de servicio de interrupción, se debe actualizar una serie de registros:

  • SP: el puntero de la pila (PSP o MSP) se actualizará a una nueva ubicación después de insertarlo en la pila. Al ejecutar rutinas de servicio, el MSP es responsable de acceder a la pila.
  • PSR: actualice el valor del campo IPSR (parte más baja del PSR) al número de excepción de la nueva respuesta.
  • PC: una vez completada la obtención del vector, la PC apuntará a la dirección de entrada de la rutina de servicio.
  • LR: El valor de LR se reinterpretará como "EXC_RETURN" al entrar o salir del ISR. Calculado por el sistema y asignado a LR en la entrada de excepción, y utilizado en devolución de excepción. (EXC_RETURN se explicará más adelante)

Lo anterior es el cambio del registro de propósito general al responder a una excepción. Por otro lado, en el NVIC también se actualizan varios registros relacionados.

Después de completar el trabajo anterior, el sistema comienza a ejecutar las instrucciones en la rutina de servicio de interrupción. Cuando se ejecuta la instrucción, entra en la etapa de procesamiento de retorno de interrupción.

retorno de interrupción

Una vez completada la ejecución de la rutina de servicio de excepción, se requiere una acción de "retorno anormal" para restaurar el estado anterior del sistema, de modo que el programa interrumpido pueda continuar ejecutándose. Instrucciones que desencadenan un retorno de interrupción:

Algunos procesadores utilizarán una instrucción de retorno especial para marcar el retorno de la interrupción, como el 8051 que utiliza reti. Pero en CM3,  EXC_RETURN la acción de devolución se reconoce escribiendo en la PC.

Después de la operación de retorno de interrupción, se realizará el siguiente procesamiento:

  • Pop: Aquí se restauran los registros previamente colocados en la pila. La secuencia emergente interna corresponde a la que tenía cuando se insertó en la pila, y el valor del puntero de la pila también vuelve a cambiar al valor anterior.
  • Actualizar el registro NVIC: el hardware borra su bit activo junto con un retorno de excepción. Para interrupciones externas, si la entrada de interrupción se afirma nuevamente, el bit pendiente se establecerá nuevamente y una nueva secuencia de respuesta a la interrupción puede comenzar nuevamente.

valor de retorno de interrupción

Como se mencionó anteriormente, después de ingresar al programa de servicio de excepción, el valor de LR se actualizará automáticamente para que sea especial  EXC_RETURN . Este es un valor cuyos 28 bits superiores son todos 1, solo el valor de [3:0] tiene un significado especial:

Cuando la rutina de servicio de interrupción envía este valor a la PC, inicia el retorno del procesador desde la interrupción. Debido a que CM3 establece automáticamente el valor de LR, siempre que no haya un requisito especial, no lo cambie.

Resumiendo la tabla anterior, podemos obtener que existen 3 valores EXC_RETURN legales:

Si el programa principal se ejecuta en modo subproceso y se interrumpe cuando se usa MSP, entonces LR=0xFFFF_FFF9 en la rutina de servicio (LR antes de que se interrumpa el programa principal se ha insertado automáticamente en la pila).

Si el programa principal se ejecuta en modo subproceso y se interrumpe al usar PSP, entonces LR=0xFFFF_FFFD en la rutina de servicio (LR antes de que se interrumpa el programa principal se ha insertado automáticamente en la pila).

Esta descripción puede ser abstracta y difícil de entender. Luego usa las dos imágenes para sentirlo intuitivamente.

El programa principal se ejecuta en modo subproceso y utiliza la pila principal.Después de ingresar la interrupción, y en el caso de anidamiento de interrupción, el cambio de modo y los cambios de LR se muestran en la siguiente figura.

Si el programa principal se ejecuta en modo controlador, entonces LR = 0xFFFF_FFF1 en la rutina de servicio (LR antes de que se interrumpa el programa principal se ha insertado automáticamente en la pila). El llamado "programa principal" en este momento es más probable que sea una rutina de servicio adelantada. De hecho, cuando está anidado, el LR visto por el ISR más profundo siempre es 0xFFFF_FFF1.

Cuando el programa principal se ejecuta en modo subproceso y utiliza la pila de procesos, el valor de LR cambia de la siguiente manera

A través de estos dos gráficos, puede comprender mejor los cambios en los valores de retorno anormales.

 Información a través del tren: ruta de aprendizaje de la tecnología del código fuente del kernel de Linux + video tutorial del código fuente del kernel

Aprendizaje a través del entrenamiento: código fuente del kernel de Linux, ajuste de memoria, sistema de archivos, gestión de procesos, controlador de dispositivo/pila de protocolo de red

interrumpir el anidamiento

El microcontrolador central Cortex-M3 admite el anidamiento de interrupciones, es decir, las interrupciones de alta prioridad pueden adelantarse a las interrupciones de baja prioridad para ejecutar instrucciones. Necesitamos establecer una prioridad adecuada para cada interrupción en función del uso real.

Los procesadores NVIC y CM3 controlan el comportamiento de preferencia y anidamiento según la configuración de prioridad. Con el apilamiento y la extracción automáticos, no tenemos que preocuparnos por corromper los datos del registro cuando se anidan las interrupciones.

Como sabemos, todas las rutinas de servicio usan solo la pila principal (MSP). Entonces, cuando el anidamiento de interrupciones se profundice, la presión sobre la pila principal aumentará: para cada nivel de anidamiento, se necesitan al menos 8 palabras más, es decir, 32 bytes de espacio de pila (esto no cuenta los requisitos adicionales del ISR para la pila), y cuándo y cuántos niveles se anidan también es impredecible.

Si la capacidad de la pila principal ya se está agotando y el anidamiento de interrupciones se profundiza repentinamente, la pila principal corre el riesgo de desbordarse. El desbordamiento de pila es fatal. Los nuevos datos en la pila sobrescribirán los datos en frente de la pila principal y los datos serán destruidos.

Si los datos en el área de alias se modifican antes de que regrese la rutina de servicio, es probable que el sistema no funcione correctamente después de que regrese la interrupción de ejecución, e incluso el programa puede ejecutarse.

Cabe señalar que no se permite la reentrada de la misma excepción (interrupción). Debido a que cada excepción tiene su propia prioridad, y durante el manejo de excepciones, se bloquean las excepciones del mismo nivel o menor prioridad.

Por lo tanto, para la misma excepción, solo después de que se haya ejecutado la rutina de servicio de la última instancia, puede continuar respondiendo a nuevas solicitudes. Por lo tanto, en la rutina de servicio SVC, no se debe utilizar el comando SVC, de lo contrario se producirá un fenómeno de falla.

interrupción de mordedura de cola

Para acortar la latencia de interrupción, el núcleo Cortex-M3 agrega un mecanismo de "interrupción de mordedura de cola".

Cuando el procesador está respondiendo a una interrupción, si vuelve a ocurrir una interrupción de baja prioridad o de la misma prioridad, se bloqueará. Después de que regrese la ejecución de la interrupción actual, cuando el sistema maneje la interrupción suspendida, ya no hará POP primero y luego PUSH de nuevo el contenido POP; en su lugar, continuará usando el resultado de la interrupción anterior que ha sido PUSHed.

De esta manera, parece que la última interrupción mordió la cola de la interrupción anterior, y solo se realizó una operación push/pop de ida y vuelta. Como resultado, la "brecha de tiempo" entre estas dos anomalías se redujo mucho.

interrupción tardía

El manejo de interrupciones de CM3 tiene otro mecanismo, que es el "manejo tardío de excepciones".

Cuando la secuencia de respuesta de CM3 a una excepción aún se encuentra en la etapa inicial: la etapa de inserción en la pila y su rutina de servicio aún no se ha ejecutado, si se recibe una solicitud de excepción de alta prioridad en este momento, entonces esta inserción en la pila se convierte en un interrumpido de alta prioridad lo que se hizo.

Después de colocarse en la pila, se ejecutará la rutina de servicio para la excepción de alta prioridad. Se puede ver que aunque llega tarde, todavía se ejecuta primero debido a su alta prioridad.

Por ejemplo, si una excepción de alta prioridad #2 se detecta temprano en respuesta a una excepción de baja prioridad #1, siempre que la #2 no sea demasiado tarde, se puede manejar de una manera de "interrupción tardía": Ejecutar después de la el empuje está completo ISR #2.

Si la excepción n.° 2 llega tan tarde que la instrucción de ISR n.° 1 ya se ejecutó, se maneja como una preferencia normal, lo que requiere más tiempo de procesador y espacio de pila adicional.

Una vez completada la ejecución de ISR #2, se inicia la ejecución de ISR #1 en forma de "interrupción de mordedura de cola".

Autor del texto original: [ Learn Embedded Together ]

Supongo que te gusta

Origin blog.csdn.net/youzhangjing_/article/details/131994288
Recomendado
Clasificación