Interrupt Latenz fortlaufen messen(schätzen) mit Timer?

Gast #5230186
Lesenswert?

Die Interrupt-Latenz ist als Zeit vom Auftreten des Interrupts
bis zum Beginn der Bearbeitung definiert.

Ganz grob ist der Zählerstand die Latenzzeit.
Falls du vorher noch Register sicherst, kannst du die Takte
dafür abziehen.

Es ist aber nicht unbedingt die maximale Latenzzeit:
Bei einigen µCs kann die Zeit davon abhängen, ob gerade ein
1-Takt-Befehl, oder ein Mehr-Takt-Befehl bearbeitet wurde.

Weiterhin können bei ungünstigstem Zusammentreffen alle
anderen Interrupts noch ihre aufsummierten maximalen
Bearbeitungsdauern als Verzögerung dazubringen!

Oder Befehlssequenzen, die mit unterdrückten Interrupts
ausgeführt werden müssen.

Beim defensiven Programmieren summiert man alle diese
Zeiten und fragt sich, ob dann die Signalbearbeitung noch
100% sicher ist.

Definier doch eine globale Variable MAX_LAT (Anfangswert = 0)
und speichere dort jeden Zählerstand, der größer, als der
bisherige Wert ist.

Im Hauptprogramm kannst du eine Sequenz für die Überwachung von
MAX_LAT einbauen.

Eventuell muss es aber ein 16-Bit-Wert sein (mehr als 255
Latenz-Takte) - und vielleicht tritt der Worst-Case-Wert auch
erst nach 7 Monaten auf.
Gast #5230371
Lesenswert?

offline schrieb:

> wenn ein Timer(upcounter) mit dem CPU-Takt läuft, und bei einem Overflow
> einen Interrupt auslöst, ist dann der Wert im 'count' Register(das sich
> dauernd ändert) die Interrupt Latenz in Taktzyklen?

Ja, allerdings nur für den Einzelfall. Sprich: der Wert kann u.U. ganz 
erheblich schwanken. Wenn du allerdings sehr viele Messungen mit diesem 
Ansatz machst, dann entpricht der gemessene Minimalwert manchmal 
näherungsweise der statischen bzw. systematischen Interruptlatenz, die 
Differenz aus Maximalwert der Messungen und Minimalwert der Messungen 
entspricht manchmal näherungweise der variablen Interruptlatenz.

Wenn du diese Werte nicht anders als mit Messen ermitteln kannst, hast 
du eigentlich schon verloren, jedenfalls wenn du ein Realtime-System 
bereitstellen oder betreiben willst. Dafür muß man nämlich für beide 
Eigenschaften den worst case vorab als Konstante beziffern können...

Das muss naturgemäß in jeder anderen Sprache als Assembler scheitern und 
selbst in Assembler ist es nur auf einfachen Zielarchitekturen einfach 
zu ermitteln...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren