¡Esta es una revisión vieja del documento!


Controlador de Interrupciones Genérico

Este artículo asume que el lector se encuentra familiarizado con los tipos de excepción, el manejo de una interrupción y los registros de cada modo de un núcleo ARM, versión 7 para el caso que nos compete.

Antes de comenzar vale la pena recordar dos conceptos elementales:

  • Un controlador de interrupción es un módulo (IC, ASIC, FPGA, etc) que se encuentran entre las fuentes de interrupción (periféricos) y los núcleos ARM, el cual decide cómo gestionar (priorizar, habilitar, direccionar) las interrupciones.
  • El núcleo ARM acepta solo dos señales de entrada no programadas que manejan interrupciones de los sistemas externos: nIRQ y nFIQ. Como se debería saber si se recibe IRQ, el sistema ingresa al modo IRQ o FIQ, si se recibe una FIQ.

Si bien dependiendo de las licencias ARM, es decir del fabricante de SoC, se decide el mecanismo para direccionar las señales de interrupción al núcleo, en este artículo se tratará el método estandarizado y más frecuentemente empleado, el Global Interrupt Controller. Es importante aclarar que no se pretende brindar una explicación detallada del GIC, ya que para ello se encuentra disponible la especificación correspondiente, sino su aplicación para el caso de uso de la Cátedra.

Arquitectura

En la versión 2 de la especificación (ARM IHI 0048B ID061411) se disponía de un diagrama que puede ser de mucha utilidad para comprender los bloques constitutivos del GIC y su interconexión con el núcleo ARM.

GIC logical partitioning

Si bien el diagrama presenta la arquitectura para múltiples núcleos (processors), en nuestro caso de uso (cortex A8) solo basta con reducir el esquema a un solo procesador.

Según la fuente, hay tres tipos principales de interrupciones definidas.

Interrupciones de periféricos compartidos (Shared Peripheral Interrupts): Identificador de interrupción del 32 al 1019. Son las fuentes de interrupción generadas por los diferentes periféricos del sistema que pueden ser direccionadas (re/compartirse) a cualquiera (uno o más) de los núcleos según la configuración implementada. A modo de ejemplo se podría mencionar el caso de dos temporizadores independientes (TIMER0 y TIMER1) conectados a las líneas SPI y configurándose en el Distribuitor para direccionarse a dos de los núcleos disponibles. En la interrupción del TIMER0, la señal se direcciona al primer procesador disponible (cualquiera de los dos configurados). Si el TIMER1 requiere su atención, cuando aún no finalizó la correspondiente al TIMER0, el Distribuitor la direcciona al restante núcleo configurado para su manejo.

Interrupciones de periféricos privados (Private Peripheral Interrupts): Identificador de interrupción del 16 al 31. Son las fuentes de interrupción generadas por los diferentes periféricos del sistema que debe ser direccionadas a un núcleo específico. Un ejemplo típico de este tipo de interrupción se presenta en el caso los sistemas asimétricos como ser un Cortex A y Cortex M, en donde una interrupción generada por un Watchdog correspondiente al núcleo A solo debe direccionarse al mismo.

Interrupciones generadas por software (Software Generated Interrupts): Identificador de interrupción del 0 al 15. ARM reserva este rango específicamente para la comunicación entre procesadores. Una SGI puede ser direccionada a uno o más procesadores a través del Distributor.

Las Interrupciones 0 a 31 son almacenadas por el Distribuitor para cada CPU Interface, es decir, cada procesador las ve de manera diferente y se identifican por el CPUID. Por ejemplo la PPI 20 podría estar pendiente en CPU0 pero no en CPU1. Mientras que en el caso de la SPI, será la misma en todos los CPU.

Independientemente de todo lo mencionado, cada núcleo recibe una señal a través de líneas nIRQ o nFIQ para interrumpir la ejecución del programa.

A continuación describiremos sintéticamente el objetivo de cada submódulo

Distributor:

Es responsable de gestionar las interrupciones en todo el sistema, decide las prioridades entre ellas, el mecanismo de direccionamiento de las mismas así como también permite la habilitación de cada una en forma independiente. Solo existe una instancia de este componente y esta orientado a presentar las interfaces de interconexión a los la periféricos.

CPU Interface

Existe una instancia por núcleo de CPU disponible e interconecta la interfaz provista por el Distributor con el núcleo correspondiente. Cada interfase permite:

  • Ítem de lista desordenadaÍtem de lista desordenadaDes/habilitar la señal de IRQ al procesador
  • Dar acuse de recibo de la interrupción
  • Indicar que el procesamiento de la interrupción se ha finalizado
  • Establecer la mascara de prioridades de interrupción
  • Definir la preemption policy del procesador
  • Determinar la interrupción de mas alta prioridad

Interfaz de programación

Caso de uso PB-A8

A los fines de la placa empleada, para la resolución de la guía de trabajos prácticos del primer cuatrimestre, el GIC a configurar para el uso de IRQ es el 0 el cual tiene asociado el ID#36 para el Timer0

ChristiaN 2023/05/16 00:17