Timer Interrupt stört Programmierung über ETS

Fragen und Diskussionen zur Entwicklung von neuen Geräten. Sowohl Hardware als auch Software. English is welcome.
Antworten
Olli
Beiträge: 70
Registriert: 12. Aug 2014, 20:52
Wohnort: Moormerland / Ostfriesland

Timer Interrupt stört Programmierung über ETS

Beitrag von Olli »

Hallo,

ich möchte einen Timer Interrupt nutzen, um zeitlich relativ genau Messungen durchzuführen.
Diese Messungen sollen im Abstand von 50ms druchgeführt werden. Es sind zwei verschiedene Messungen, die immer abwechselnd durchgeführt werden sollen.
Also: Messung 1 -> 50ms Pause -> Messung 2 -> 50ms Pause -> Messung 1 -> ...

Der Ansatz bisher: einen Timer (bei mir timer32_0) mit 1ms Schrittweite und match (MAT0) bei 50ms starten.
In dem generierten Interrupt (TIMER32_0_IRQHandler) werden dann die Messungen abgearbeitet.

Dieser Timer Interrupt scheint jedoch die Programmierung über die ETS zu stören.
Mit eingeschaltetem Timer bricht die Programmierroutine der ETS bei dem Neustart des Gerätes ab.
Sobald ich den Timer auslasse, bzw. den Interrupt nicht aktiv setze, lässt sich das Gerät problemlos mit der ETS bedaten.


Ein weiterer Ansatz war:
Den Timer nach jedem Messzyklus (Messung 1 und Messung 2) stoppen und in der loop() Funktion wieder zu starten.
Also: Timer start im loop() -> 50ms Pause -> Messung 1 -> 50ms Pause -> Messung 2 -> Timer stop

Dieses hat meiner Meinung nach den Vorteil, dass wenn die loop() Funktion aufgrund anstehender Programmierung nicht mehr ausgeführt wird, auch der Timer nach spätestens 100ms keine Interrupts mehr generiert.
Leider funktioniert dieser Ansatz genauso wenig wie die erste Variante mit durchlaufendem Timer.


Ich habe bisher wirklich keine Idee zu diesem Thema, zumal ich die Befehle aus der sblib zur Timersteuerung verwende. (aus example-int-blink)

Habt ihr eine Idee?

Vielen Dank!

Grüße,
Olli
oldcoolman
Beiträge: 645
Registriert: 17. Mai 2013, 20:57
Kontaktdaten:

Re: Timer Interrupt stört Programmierung über ETS

Beitrag von oldcoolman »

Hört sich nach Echtzeitprogrammierung an. Den Timer nur in der Applikation-Run-loop auszuführen, ist schon mal ein Ansatz, nur gibt es auch ausserhalb der Programmierangelegenheit Telegramme, die verstanden und abgearbeitet werden müssen. Generell ist es ein Problem wenn man 2 Dinge sehr zeitnah machen muß. Bus versus Messung. In einen solchen Fall hilft entweder sehr viel Rechenleistung oder ein Teil muß ausgelagert werden. Wichtig ist klar auch dass der BUS interrupt die höhere Priorität hat.
liebe Grüße
Andreas
Olli
Beiträge: 70
Registriert: 12. Aug 2014, 20:52
Wohnort: Moormerland / Ostfriesland

Re: Timer Interrupt stört Programmierung über ETS

Beitrag von Olli »

Hallo oldcoolman,

danke für den Hinweis mit der Priorität der Interrupts.
Daran hatte ich noch gar nicht gedacht.

Ich habe nun mittels NVIC_SetPriority(TIMER_32_0_IRQn, 1) meinem Interrupt eine niedrigere Priorität (Level 1) gegeben als alle standardmäßig initialisierten Interrupts, die den Level 0 (=höchste Priorität) bekommen.

Nun funktioniert die Programmierung über ETS problemlos.

Grüße,
Olli
Antworten