Forum: Mikrocontroller und Digitale Elektronik STM32F1 ISR zeit, CortexM3 SFR


von Donald (tick1234)


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.

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

1. Ab besten mit dem Scope und dem wackeln eines freien Pins an den du 
rankommmst
2. Referenzmanual u. ae.?

von STM Apprentice (Gast)


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.

von Donald (tick1234)


Lesenswert?

Uwe B. schrieb:
> 1. Ab besten mit dem Scope und dem wackeln eines freien Pins an den du
> rankommmst

Hmm digital also mit Hilfe der SFR ist dies umständlich/nicht möglich?

von Donald (tick1234)


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.

: Bearbeitet durch User
von W.S. (Gast)


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.

von Michael F. (Firma: IAR Systems) (michael_iar)


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

von Donald (tick1234)


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)?

: Bearbeitet durch User
von J. S. (jojos)


Lesenswert?

Donald schrieb:
> Nur
> irgendie finde ich kein DWT in meinen SFR (STM32F1)?

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

von STM Apprentice (Gast)


Lesenswert?

Donald schrieb:
> Nur irgendie finde ich kein DWT in meinen SFR (STM32F1)?

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

von Donald (tick1234)


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...

von Stefan F. (Gast)


Lesenswert?

Donald schrieb:
> Wo/Wie befinden sich beim F1 die Interrupt Vektoren

http://stefanfrings.de/stm32/stm32f1.html#ivektoren

Ich weiß allerdings nicht, ob und wie man die Interrupthandler der HAL 
elegant durch eigene ersetzen kann. Notfalls kannst du die Vektoren ins 
RAM kopieren, verändern und dann SCB->VTOR darauf einstellen.

von Harry L. (mysth)


Lesenswert?

Stefan F. schrieb:
> Ich weiß allerdings nicht, ob und wie man die Interrupthandler der HAL
> elegant durch eigene ersetzen kann.

Das geht sogar durch passende Einstellungen in CubeMX.
Findet sich in den NVIC-Settings.

: Bearbeitet durch User
von STM Apprentice (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.