WFI-Befehl verlangsamt SYStick-Interrupt

Ich habe mein Infineon-Relax-Kit für die maximale Frequenz (120 MHz) konfiguriert. Ich habe meinen SYSTick auf einen periodischen Interrupt von 10 ms eingestellt. Zum Energiesparen verwende ich einen WFI-Assembler-Befehl, wenn mein Prozessor im Leerlauf ist. WFI (Warten auf Interrupt) sollte den Prozessor in den Energiesparmodus versetzen, bis ein Interrupt auftritt. Also sollte mein Prozessor alle 10 ms aufwachen. Aber irgendwie hat dieser WFI-Befehl meine Interrupt-Frequenz auf fast das Dreifache verlangsamt und er wacht bei jedem dritten Interrupt auf. Was kann ein möglicher Grund dafür sein, dass WFI nicht bei jedem Interrupt aufwacht?

Sagt das Datenblatt etwas darüber aus, wie lange es dauert, aus dem Energiesparmodus aufzuwachen? Wird auch die Interrupt-Latenz und jede Verzögerung beim Erreichen der maximalen Frequenz erwähnt? Kannst du das Datenblatt verlinken? Welche Uhr läuft im Energiesparmodus?
Woher wissen Sie, dass es nur jeden dritten Interrupt aufweckt? Ist es möglich, dass Ihre MCU in einen tieferen Schlafmodus wechselt, der die Kernfrequenz reduziert?
Link zum Datenblatt: keil.com/dd/docs/datashts/infineon/xmc4500/xmc4500_um.pdf Datenblatt sagt nichts über Interrupt-Latenz aus. Ich habe die Systemuhr (CCU) im SleepCR-Register aktiviert, um allen Auswirkungen des Takt-Gatings entgegenzuwirken, aber ohne Erfolg. @ Roger Rowland
@corecode Ich habe eine Variable, die bei jedem Systick-Interrupt erhöht wird. Ohne WFI erhöht es sich in 10 Sekunden auf 1000, aber mit WFI erhöht es sich nur auf 330. Das bedeutet also, dass mein Interrupt bei jedem dritten Anruf bearbeitet wurde. Oder alternativ hat sich meine effektive Frequenz auf das Dreifache reduziert. Meine MCU geht standardmäßig in den Schlafmodus (nicht Tiefschlaf).
Cortex M4F benötigt 6 Zyklen, um vom normalen WFI wieder aufzustehen, sollte kein Problem sein, wenn die Uhren gleich bleiben (was ich herauszufinden versuche, aber das Benutzerhandbuch ist schrecklich). Können Sie die für Systick verwendete Uhr ausgeben und untersuchen, was passiert, wenn Sie zu WFI gehen?
@Arsenal Eigentlich kann ich die Uhr nicht ausgeben. Es gibt offensichtlich mehr als 6 Zyklen in 10 ms, wenn Sie mit 120 MHz laufen. Kann WFI möglicherweise auch die Systemuhr gaten, die Interrupts auf SYSTick erzeugt?

Antworten (1)

Ich kenne diese Geräte nicht, aber in der Bedienungsanleitung steht folgendes:

Der Sleep-Zustand des Systems entspricht dem Sleep-Zustand der CPU. Der Zustand wird über den WFI- oder WFE-Befehl der CPU eingegeben. In diesem Zustand wird der Takt zur CPU gestoppt. Die Quelle der Systemuhr kann geändert werden. Peripherieuhren werden gemäß dem SLEEPCR-Register torgesteuert.

Ein Blick auf die Registerbeschreibung SLEEPCR zeigt:

Field  Bits Type Description 
SYSSEL 0    rwh  System Clock Selection Value
                 0 -> f OFI clock, 1 -> f PLL clock

Da der Rücksetzwert des Registers 0 ist, ist es standardmäßig auf F Ö F ICH Uhr. Welche läuft auf 36,5 MHz unkalibriert oder 24 MHz kalibriert. Es hat einen ziemlich großen Genauigkeitsbereich, wenn es unkalibriert ist (siehe Datenblatt ) von mindestens +-15%, zusammen mit der Tatsache, dass Sie während Ihrer Ausführung wieder einige Systicks mit 120 MHz erhalten, es könnte sich herausstellen, dass es sich um ungefähr 40 MHz handelt Durchschnitt.

Lösung (hoffentlich): Setzen Sie das SYSSEL-Bit auf 1.

Danke für den Tipp. Es ist mir nicht eingefallen. Ich habe das CCU-Bit im SLEEPCR-Register gesetzt.