Benötigen Sie Hilfe beim Aufspüren der Ursache einer Verzögerung zwischen Timer-Interrupts auf der SAM-MCU

Ich habe ein Projekt, das eine Reihe von Werten mit einem genauen Zeitintervall an DACs ausgibt. Das Problem besteht darin, dass zwischen dem Systemzeitgeber-Interrupt, in dem die DAC-Werte aktualisiert werden, manchmal eine Verzögerung auftritt, die länger als erwartet ist. Dies führt zu Jitter in der Ausgabe. Ich brauche Hilfe, um herauszufinden, was diese Verzögerung verursacht. Der einzige andere Benutzercode, der neben dem Timer läuft, ist die Behandlung eingehender USB-Pakete, die die auszugebenden Daten enthalten.

Dinge, die ich versucht habe:

  • Verringern der Priorität jedes einzelnen Interrupts außer dem Timer
  • Deaktivieren Sie jede Art von Schlafmodus, der möglicherweise Zeit zum Aufwachen benötigt
  • Verringern der USB-Paketgröße, damit sie schneller verarbeitet werden können (obwohl dies aufgrund ihrer Interrupts mit niedrigerer Priorität den Timer sowieso nicht stören sollte)

Aber nichts hat bisher funktioniert.

Der vollständige Code ist hier: https://github.com/Grix/helios_dac/blob/master/firmware/AtmelStudio_helios/lasdac_mainfirmware/src/main.c

Die MCU ist ein Atmel ATSAM4S2B (32-Bit-Arm-Cortex-m4)

Irgendwelche Ideen?

EDIT: Ich habe das Problem gefunden, es waren die Interrupt-Prioritäten. Ich habe die Prioritäten beim Booten festgelegt, aber die SysTick_Config()-Funktion der CMSIS-Bibliothek setzt die Priorität für den Systick bei jedem Aufruf zurück, sodass ich die Priorität bei jedem Aufruf manuell korrigieren musste.

Meinst du, es gibt eine zusätzliche Verzögerung zwischen aufeinanderfolgenden System-Timer-Interrupts? Oder dass es eine zusätzliche Verzögerung zwischen dem Interrupt und etwas anderem gibt? Wie messen Sie die Verzögerung, um den Jitter zu erkennen? Erwägen Sie, einen oder mehrere GPIO-Pins im gesamten Code umzuschalten, und verwenden Sie einen Logikanalysator, um die Umschaltungen in Echtzeit zu beobachten. Passen Sie dann die Umschaltpunkte an, um den Problembereich einzugrenzen, bis die Quelle klar wird.
Wenn zwischen aufeinanderfolgenden Interrupts des Systemzeitgebers eine zusätzliche Verzögerung auftritt, ist es dann möglich, dass der vorherige Interrupt-Handler nicht beendet wird, bevor das nächste Interrupt-Ereignis aktiviert wird? Der Interrupt-Handler darf nicht länger laufen als der Zeitraum zwischen Interrupts.
@GrixM - Da Sie das Problem gefunden haben (gut gemacht :-)), schreiben Sie bitte eine Antwort mit diesen Details (und akzeptieren Sie sie), anstatt die Antwort in die Frage zu bearbeiten. Wenn Sie eine Antwort akzeptieren, wird die Frage als "beantwortet" markiert und Sie erhalten auch Punkte für die Antwort.

Antworten (1)

Ich habe das Problem gefunden, es waren immerhin die Interrupt-Prioritäten. Ich habe die Prioritäten beim Booten festgelegt, aber die SysTick_Config()-Funktion der CMSIS-Bibliothek setzt die Priorität für den Systick bei jedem Aufruf zurück, sodass ich die Priorität jedes Mal manuell korrigieren musste, nachdem ich dies aufgerufen hatte.