Zeit messen zwischen zwei Punkten im Programmfluß (STM32F103)

OP #7301659
Lesenswert?

Ich will einem Ereignis, das in einer Timer-Interruptroutine markiert wird (ein Array von 32 Ereignissen) einen Zeitstempel zuordnen. Im Hauptprogramm soll das jüngste Ereignis herausgefunden werden, indem das Maximum der Zeitstempel ermittelt wird.

Um zwei Ereignisse unterscheiden zu können, müßte ich die Zeit kennen, die minimal zwischen den Ereignissen liegen kann.

Die kenne ich per Programmfluß. Ich müßte sie aber irgendwie ermitteln können. Instruktionen zählen wäre eine Möglichkeit. Programm ist aber in C. Gibt es im Debugger (STM32CubeIDE) eine Möglichkeit, die Zeit zwischen 2 Breakpoints zu messen?

Oder ich müßte ein Timerregister auslesen, das mit 72MHz läuft und die Werte irgendwo hinschreiben. Hätte dann ein Vielfaches von ca. 14ns zwischen den Punkten.

Ideen?

#7301677
Lesenswert?

1 ms ist aber sehr grob und ein Interrupt jede ms nervt auch. Dann schon lieber einen Timer auf 1 µs frei laufen lassen und für Start/Stoppzeit auslesen. So einen Timer hat mein Lieblings OS als Standard drin und ein Softwaretimer ist mit 'Timer t;' schnell erzeugt :)

Gast #7301679
Lesenswert?

jo mei schrieb:

Der TO will es aber ein bisschen genauer wissen. Er will nicht wissen dass ein Ablauf 1 oder 2 ms braucht.

Mit dem Systick kann man auch in kleiner Intervallen zählen. Aber es um einstellige µs oder gar ns Intervalle geht, ist der DWT wohl die bessere Wahl.

Gast #7301686
Lesenswert?

Im Hauptprogramm soll das jüngste Ereignis herausgefunden werden, indem das Maximum der Zeitstempel ermittelt wird.

Zwei Punkte:

  1. bzgl Maximum: mach dir Gedanken um Überläufe des Zählers.
  2. bzgl jüngste: in einer Variable die Nummer des letzten Ereignisses speichern?
Gast #7301690
Lesenswert?

Stefan F. schrieb:

Mit dem Systick kann man auch in kleineren Intervallen zählen. Aber wenn es um einstellige µs oder gar ns Intervalle geht, ist der DWT wohl die bessere Wahl.

jo mei schrieb:

Klar! Du stellst den Systick-Interrupt auf 1 usec, dann braucht dein Prozessor wenigstens nichts mehr Anderes tun als Interrupts abarbeiten. Spart jede Menge Programmierarbeit.

Versuche es mal mit einer passenden Antwort. 10 µs Intervalle sind durchaus machbar. Darunter würde ich wie gesagt nicht gehen.

#7301696
Lesenswert?

Maxe schrieb:

Ich könnte mir vorstellen, dass der Debugger die Zeitspanne (negativ) beeinflusst.

nein, das ist ja das Gute bei den Cortex-M: der CoreSight ist eine Architektur die die Ausführung eben nicht beeinflusst. Ausser vielleicht bei Software BP, aber die kommen ja nicht zum Einsatz solange noch HW BP vorhanden sind.

OP #7301713
Lesenswert?

foobar schrieb:

Im Hauptprogramm soll das jüngste Ereignis herausgefunden werden, indem das Maximum der Zeitstempel ermittelt wird.

Zwei Punkte:

  1. bzgl Maximum: mach dir Gedanken um Überläufe des Zählers.

Ja, Überlauf ist natürlich zu beachten. Selbst bei einer 2µs Granularität komme ich immer noch auf eine Lebensdauer von 72h. Das wäre zwar noch zu tolerieren, aber auch nicht schön.

  1. bzgl jüngste: in einer Variable die Nummer des letzten Ereignisses speichern?

Du meinst, eine Variable einführen, die das letzte Ereignis zusätzlich speichert? Das jüngste Ereignis wird ja ermittelt und es wird abgelöst durch immer wieder jüngere. Aber es gibt in der Tat sowas wie "last_event".

Gast #7301721
Lesenswert?

Wenn ich's wissen will, programmiere ich einfach einen IO Pin zum Anzeigen wie lange ein Zeitabschnitt dauert. Mit dem Oszi kann man das für die Praxis in den meisten Fällen genau genug ermitteln. Bei Architekturen wie beim F103 ist es allerdings wegen der internen Peripherie etwas ungenauer.

Gast #7301742
Lesenswert?

Irgendwo hat irgendwer erwähnt, daß er den DAC an interessanten Stellen im Programm so programmiert, daß man dann am Oszi genau verfolgen kann wo und wie lang sich der Prozessor im Programm aufhält. Ist eine Geniale Idee.

Gast #7301794
Lesenswert?

J. S. schrieb:

Maxe schrieb:

Ich könnte mir vorstellen, dass der Debugger die Zeitspanne (negativ) beeinflusst.

nein, das ist ja das Gute bei den Cortex-M: der CoreSight ist eine Architektur die die Ausführung eben nicht beeinflusst. Ausser vielleicht bei Software BP, aber die kommen ja nicht zum Einsatz solange noch HW BP vorhanden sind.

In deinem Link wird der DWT ja per Code gesteuert (und damit auch die Messung). Ueber den Debugger wird dann nur noch der Zahlerstand ausgelesen. Die Frage ist, ob es auch eine Loesung mit Breakpoints gibt.

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