STM32F103 - Mehrere "Timer-Tasks"

OP #5148520
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.
Gast #5148524
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.
#5148529
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.
#5148539
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
Gast #5148548
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.

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