2012-08-04 22 views
5

Esta pregunta ya ha sido contestada para x86 sin embargo, no pude encontrar mucho acerca de CPUs ARM MP como Cortex-A9, Cortex-A15, etc ...¿Cómo funcionan las interrupciones en la CPU ARM multinúcleo

más importante i Quiero saber si las interrupciones se pueden generar en la CPU no primaria sin ninguna configuración, etc.

Estoy trabajando en un software que solo se ocupa de la CPU principal, por lo tanto pongo el resto en el estado WFI sin embargo no sé cómo interrumpen trabajar en el MP arm cpus, ¿es posible que la CPU principal continúe ejecutando el código y una de las CPU secundarias la levante y salte a la instrucción en la tabla vectorial y ejecute ese código?

por cierto aquí es el código que estoy usando para ponerlos a modo de bajo consumo

uint32_t reg; 

    __asm__ volatile("mrc p15, 0, %0, c0, c0, 5" : "=r" (reg)); 
    reg &= 0xF; 

    if(reg > 0) 
     goto spin; 

<code snipped> 

spin: 
    for(;;) 
     cpu_idle(); // cpu_idle -> wfi 
+0

¿ha mirado ARM ARM y TRM para el mpcore? –

+0

Sí, menciona algunas cosas sobre GIC y cómo funciona el IPI, pero nada sobre cómo se programan las interrupciones generales. – sgupta

Respuesta

6

La corta y para fines prácticos respuesta correcta es que lo que se pide no es posible sin una cierta configuración se realiza en los núcleos secundarios ...

se describe la arquitectura de controlador de interrupción (en bastante detalle) en http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ihi0048b/index.html

para preparar los núcleos secundarios para recibir IPI, es necesario:

  • Habilitar el Distribuidor GIC (una vez, para todo el sistema)
  • Habilitar la interfaz de CPU GIC (para cada núcleo)
  • Habilitar los IPI que desea recibir (por cada núcleo)
  • Establecer el prioridades para cada IPI que desee recibir (para cada núcleo)
  • Asegúrese de que la interfaz de CPU Registro de máscara de prioridad de interrupción (para cada núcleo) esté configurada en un nivel de prioridad inferior (número superior) que la prioridad de interrupción que configuró anteriormente.
  • Borrar el bit I CPSR (para cada núcleo)

Si no tiene la intención de implementar un controlador de interrupciones, no tome la limpieza de la I-bits. El núcleo saldrá de WFI y continuará ejecutándose. Eso es normalmente lo que quiere para una operación de arranque del sistema.

+0

En cuanto a la distribución de interrupciones a núcleos no primarios, los Registros de destinos del procesador de interrupción especifican qué núcleos reciben cada una de las interrupciones periféricas compartidas. – unixsmurf

+0

así que a menos que elimine explícitamente el bit I en CPSR de los núcleos secundarios, las interrupciones se enmascararán y WFI las mantendrá en modo de bajo consumo para siempre, ¿verdad? también WFE wake core en una interrupción? Entonces, ¿si un software después de mis propias botas podrá despertar esos núcleos de WFI? Por lo tanto, estoy pensando en usar WFE pero en un uniprocesador no tenemos otro núcleo para enviar una señal si estamos en WFE, así que solo queremos asegurarnos de que si la interrupción despierta el núcleo de WFE – sgupta

+0

Nopes. Lo que el bit I hace es evitar que se tome la interrupción (cambiar el modo/saltar al vector). Con el bit I establecido, el núcleo seguirá saliendo del estado de baja energía, pero continuará ejecutando la instrucción después de WFI en el programa. Sí, las interrupciones también despiertan núcleos en WFE. Pero si está pensando en usar SEV/WFE como reemplazo de IPI, debe considerar el hecho de la entrega no garantizada. – unixsmurf

Cuestiones relacionadas