STM32F1 ISR zeit, CortexM3 SFR

OP #7313028
Lesenswert?

2 kurze Fragen:

  1. Wie messe ich die Zeit (wie viele clk) meine ISR benötigt am geschicktesten. (am besten ohne timer etc.)? CortexM3 Systick variablen?
  2. Wo/Wie befinden sich beim F1 die Interrupt vektoren, wieviele unterschiedliche Interrupt vektoren sind vorhanden und wie können diese aufgeteilt werden? Im Cube kann ich beim NVIC irgendwie nur interupt Prioritäten vergeben.

Motivation: Ich möchte meine Interrupt Last verringern und daher einen IRQ vektor direkt auf meine funktion mappen, und die weniger häufigen/zeitkritischen Interrupts alle auf das HAL.

Gast #7313039
Lesenswert?

Donald schrieb:

  1. Wie messe ich die Zeit (wie viele clk) meine ISR benötigt am geschicktesten.

So wie hier z.B. beschrieben:

Beitrag "Zeit messen zwischen zwei Punkten im Programmfluß (STM32F103)"

Oder mit dem Oszilloskop. Am Eintrit aud Autritt deiner ISR betätigst du einen Portpin dessen Aktivität du mit dem Oszilloskop beobachtest und daraus deine Zeit ermittelst.

Donald schrieb:

Wo/Wie befinden sich beim F1 die Interrupt vektoren

Im Startup File, üblicherweise <startup_stm32fxxxx.s>

Donald schrieb:

wieviele unterschiedliche Interrupt vektoren sind vorhanden und wie können diese aufgeteilt werden? Im Cube kann ich beim NVIC irgendwie nur interupt Prioritäten vergeben.

Ich hoffe du bist des Lesens mächtig und kannst das Reference Manual deines Controllers durcharbeiten. Da steht nämlich alles drin.

OP #7313059
Lesenswert?

STM Apprentice schrieb:

Im Startup File, üblicherweise <startup_stm32fxxxx.s>

Danke ahh schön das geht ja direkt in die HAL Interrupt funktion; jede einzeln, da inst mein Vorhaben einfach.

STM Apprentice schrieb:

Ich hoffe du bist des Lesens mächtig und kannst das Reference Manual deines Controllers durcharbeiten. Da steht nämlich alles drin.

Hat sich erüberigt ein blick ins vektorfile hat diesbezüglich genügt. Danke.

Gast #7313066
Lesenswert?

Donald schrieb:

2 kurze Fragen:

  1. Wie messe ich die Zeit
  2. Wo/Wie befinden sich

Wenn du weiterhin dich nur mit sowas wie Cube und Konsorten befaßt, dann wird das nix mit deinen Fragen. Also fange endlich mal an, die Dokumente zu lesen, aus denen du erfahren kannst, wie die Arm-Cortex M (0..7) denn so funktionieren. Zunächst die grundlegenden Dinge bei arm.com und dann die darauf aufbauenden Dinge beim jeweiligen Hersteller.

Die Interrupt-Vektoren befinden sich für gewöhnlich am Anfang des adressierbaren Speicherbereiches, also ab Adresse 0. Und es sind verschieden viele, je nach Chip. Und bei einigen Architekturen kann man sie vom Programm aus auch woandershin verlegen. Und üblicheweise befindet sich an der Stelle der Flash-Speicher, damit die CPU am Anfang etwas sinnvolles zum Abarbeiten vorfinden kann. Ist aber nicht überall so, z.B. haben die Chips von Infineon dort ROM, also nix, was man selbst mit dem beschreiben kann, was man braucht. Und bei den STM32 ist es so, daß der Flash normalerweise zweimal im Speichervolumen auftaucht: ab 0 und ab 8000000h (wimre), so daß die Programmierer die Wahl haben, ihr Programmier-Kunstwerk in einem der beiden Bereiche laufen lassen zu können.

W.S.

Gast #7313073
Lesenswert?

Donald schrieb:

  1. Wie messe ich die Zeit (wie viele clk) meine ISR benötigt am geschicktesten. (am besten ohne timer etc.)? CortexM3 Systick variablen?

Moin,

wenn Du SWD + SWO als Debug Interface nutzt, dann am geschicktesten mit einem Debugger, der Interrupts sinnvoll anzeigen kann...

Also so in der Art: https://www.iar.com/knowledge/learn/debugging/interrupt-logging/

Segger Ozone sollte das wahrscheinlich auch können, da können aber eventuell andere User mehr Input zu liefern.

Gruß, Michael

OP #7313084
Lesenswert?

Michael F. schrieb:

https://www.iar.com/knowledge/learn/debugging/interrupt-logging/

Perfekt genau sowas suche ich; ja nutze SWD Debug. Gehts mit dem Cube irgendwie auch? (etwas weniger luxus ist auch ok die manuelle auslesung einer isrzeit in nur einem ereignis (ohne statistik mit max min avg etc).

DWT_CYCCNT scheint mein gewünster counter zu sein. (Einen timer kann ich ja nicht direkt nutzen da dieser im breakpoint weiterläuft). Nur irgendie finde ich kein DWT in meinen SFR (STM32F1)?

OP #7313131
Lesenswert?

J. S. schrieb:

die gehören zum ARM core der im CMSIS beschrieben ist.

Ja ist aber bei mir im Cube nicht in den SFR. Fehlt anscheinend im STM32F103.svd?

STM Apprentice schrieb:

Nimm doch einfach die paar Code-Zeilen die hier im angegebenen Thread gezeigt sind.

Du meinst hier: https://mcuoneclipse.com/2017/01/30/cycle-counting-on-arm-cortex-m-with-dwt/ - ja dies ist gut und sollte funktionieren. Anyway sollte eigetnlich im cube in den SFRs sein? Die Lösung im link ist eigentlich ein workaround. Und user code einfügen damit man debuggen kann ist etwas discouraged...

Gast #7313182
Lesenswert?

Donald schrieb:

Die Lösung im link ist eigentlich ein workaround. Und user code einfügen damit man debuggen kann ist etwas discouraged...

Naja, also verstanden scheinst du es (noch?) nicht zu haben. Der DWT Cylce Counter hat erst mal nichts mit Debuggen zu tun.

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