Forum: Mikrocontroller und Digitale Elektronik STM32F103 - Mehrere "Timer-Tasks"


von Walter T. (nicolas)


Lesenswert?

Hallo zusammen,

ich nutze einen STM32F103. Drei Timer sind durch andere Aufgaben belegt, 
einer spielt die Rolle eines etwas schnelleren Systick-Timers (400 kHz). 
Der Code, der in der zugehörigen ISR abläuft, ist generell erst einmal 
kurz genug, daß die Systemlast vertretbar ist, bis auf - und hier setzt 
meine Frage an:

Alle n (10 ... 1000) ISR-Aufrufe muß ich eine Rechnung machen, die etwa 
4-5µs benötigt, d.h. sie paßt nicht mehr in das 2,5-µs-Raster. Benötigt 
wird das Ergebnis erst nach n-1 ISR-Aufrufen.

Es gibt auch keine sinnvolle Möglichkeit, die Rechnung auf mehrere 
Funktionen, die kürzer als 2 µs sind (ein wenig Sicherheitsmarge mag ich 
ja auch noch...), zu verteilen.

Die main-loop ist viel zu langsam, um sie für diesen Anwendungsfall in 
Erwägung zu ziehen.

Aber: Der STM32F103 unterstützt ja Nested Interrupts, Also sollte es 
kein Problem sein, eine zweite, niedrig priorisierte ISR die "lange" 
Berechnung durchführen zu lassen und sich die Ergebnisse im Nachgang 
abzuholen.

Nur: Welchen Interrupt nutzt man sinnvollerweise für diese Aufgabe, wenn 
alle Timer belegt sind?

Viele Grüße
W.T.

von STM Apprentice (Gast)


Lesenswert?

Walter T. schrieb:
> Nur: Welchen Interrupt nutzt man sinnvollerweise für diese Aufgabe, wenn
> alle Timer belegt sind?

Braucht es nicht.

Es reicht ja ein Flag in der Hauptschleife um die Berechnung
zu starten oder auszuklammern, dieses Flag (volatile) wird
von der ISR gesetzt und nach der Berechnung gelöscht.

von Nico W. (nico_w)


Lesenswert?

Kommt ja auch auf die Hauptschleife an. Da kann man ggf. ja auch nicht 
alle 10 Zeilen nach der Flag prüfen.

Für solche Aufgaben nutze ich den PendSV_Handler.

Den trigger ich mit
1
SCB->ICSR = SCB_ICSR_PENDSVSET_Msk;
im Interrupt und führe dann 'langsamen' Code aus. Die Prio ist niedrig 
eingestellt.

von Stefan K. (stefan64)


Lesenswert?

Du kannst am Ende der ISR alle n-mal zuerst die ISR-Priorität 
herabsetzen (Register BASEPRI) und dann die Zusatzberechnung ausführen. 
Dann kann sich während der Zusatzberechnung die ISR selbst unterbrechen.

Wenn Dir das zu heiss ist, kannst Du einen Software Interrupt durch 
Setzen eines Flags in EXTI_SWIER auslösen. Dieser ISR wird dann direkt 
nach Beenden Deiner High-Speed ISR ausgelöst (wenn die ISR-Prioritäten 
richtig eingestellt sind).

Viele Grüße, Stefan

von Einer K. (Gast)


Lesenswert?

Walter T. schrieb:
> Alle n (10 ... 1000) ISR-Aufrufe muß ich eine Rechnung machen, die etwa
> 4-5µs benötigt, d.h. sie paßt nicht mehr in das 2,5-µs-Raster. Benötigt
> wird das Ergebnis erst nach n-1 ISR-Aufrufen.

Ohne jetzt den STM32 genau zu kennen, denke ich schon, dass dass man 
Iterrupts auch bei diesen Prozessor wiedereintrittsfähig schreiben kann.
Musst dann nur per Flag die Berechnung gegen Doppelaufrufe verriegeln.

von Walter T. (nicolas)


Lesenswert?

Nico W. schrieb:
> Für solche Aufgaben nutze ich den PendSV_Handler.

Danke! Der sieht genau wie für meine Aufgabe gemacht aus.

von Ben W. (ben_w)


Lesenswert?

PendSV_Handler oder falls der belegt ist den SVC_Handler oder falls der 
belegt ist einen der EXTI handler
du hast die Quall der Wahl :)

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.