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.
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.
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.
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
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.
Nico W. schrieb: > Für solche Aufgaben nutze ich den PendSV_Handler. Danke! Der sieht genau wie für meine Aufgabe gemacht aus.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.