2012-08-04 6 views
5

Diese Frage bereits jedoch für x86 beantwortet wurde, kann ich nicht viel über ARM MP CPUs wie Cortex-A9, Cortex-A15 usw. finden ...Wie funktionieren Interrupts auf Multi-Core-ARM-CPU

Noch wichtiger ist i möchte wissen, ob Interrupts auf nicht-primären CPU ohne irgendeine Konfiguration usw. ausgelöst werden können.

Ich arbeite an einer Software, die nur mit der primären CPU beschäftigt, daher ich den Rest in WFI-Zustand, aber ich bin mir nicht bewusst, wie Interrupts Arbeit am MP-Arm cpus, Ist es möglich, dass die Haupt-CPU weiterhin Code ausführt und eine der sekundären CPU es aufhebt und springt zu der Anweisung in der Vektortabelle und führt diesen Code aus?

btw hier ist der Code, den ich mit ihnen zu Low-Power-Modus zu schalten

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

hast du den ARM ARM und TRM für den mpcore angeschaut? –

+0

Ja, es erwähnt einige Dinge über GIC und wie IPI funktioniert, aber nichts darüber, wie allgemeine Interrupts geplant sind. – sgupta

Antwort

6

Die kurze und für praktische Zwecke richtige Antwort ist, dass Sie fragen, was für nicht möglich ist, ohne einige Konfiguration durchgeführt wird, die sekundären Kerne ...

Die Interrupt-Controller-Architektur (in ganz ausführlich) in http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ihi0048b/index.html

um die Sekundärkerne herzustellen zu erhalten IPIs beschrieben wird, müssen Sie:

  • Aktivieren Sie die GIC Distributor (einmal für das gesamte System)
  • die GIC CPU-Schnittstelle aktivieren (für jeden Kern)
  • die IPIs aktivieren Sie wollen (für jeden Kern) erhalten
  • Stellen Sie den Prioritäten für jedes IPI, das empfangen werden soll (für jeden Kern)
  • Sicherstellen, dass das Interrupt-Prioritätsmaskenregister der CPU-Schnittstelle (für jeden Kern) auf die niedrigere Prioritätsstufe (höhere Nummer) als die oben eingestellte Interrupt-Priorität eingestellt ist.
  • Klar die CPSR I-Bit (für jeden Kern)

Wenn Sie nicht beabsichtigen, ein Interrupt-Handler zu implementieren, die Lichtung des I-Bit überspringen. Der Kern wird aus WFI kommen und weiter ausgeführt werden. Das ist normalerweise das, was Sie für einen Systemstartvorgang wünschen.

+0

Bei der Verteilung von Interrupts an nicht-primäre Kerne geben die Interrupt-Prozessor-Zielregister an, welche Kerne die einzelnen freigegebenen peripheren Interrupts empfangen. – unixsmurf

+0

Also, wenn ich das I-Bit in CPSR der sekundären Kerne nicht explizit löschen, werden Interrupts maskiert und WFI sollte sie für immer im Low-Power-Modus halten, oder? wacht WFE auch bei einem Interrupt auf? Also, wenn eine Software nach meinen eigenen Booten wird es in der Lage sein, diese Kerne von WFI zu wecken? Daher denke ich über die Verwendung von WFE, aber auf einem Uniprozessor haben wir keinen anderen Kern, um ein Signal zu senden, wenn wir in WFE sind, also einfach sicherstellen wollen, wenn Interrupt Kern aus WFE – sgupta

+0

Nopes weckt. Was das I-Bit tut, verhindert, dass der Interrupt genommen wird (Schaltermodus/Sprung zu Vektor). Wenn das I-Bit gesetzt ist, wird der Kern immer noch aus dem Niedrigstromzustand kommen, aber es wird einfach weiter den Befehl nach WFI in dem Programm ausführen. Ja, Interrupts wecken auch Kerne in WFE. Wenn Sie jedoch beabsichtigen, SEV/WFE als Ersatz für IPIs zu verwenden, müssen Sie die Tatsache der nicht garantierten Zustellung berücksichtigen. – unixsmurf