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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.