Forum: Mikrocontroller und Digitale Elektronik Aliasing vermeiden bei ISR's


von Christian J. (Gast)


Lesenswert?

Hallo,

ich habe den Fall, dass ich 5 Timer habe, die zylische Ints erzeugen. 
Die ISR sind über Semaphore auch im Eingriff miteiander und werkeln vor 
sich hin.

Nun kann es ja sein, dass sich diese INTs so unglücklich aufteilen, da 
sie alle vom gleichen Takt erzeugt werden und in festgelegten 
Zeitabständen ab Start gestartet werden, dass 2.3.4...5 Ints 
gleichzeitig auftreten und es sich dann beim NVIC etwas "knubbelt."  Die 
Ints sind nicht als nested interrupts ausgeführt, das soll auf jden Fall 
vermieden werden.
1s, 10s, 60s sind ja auch alles Vielfache voneinander.

Gibt es Techniken sowas zu vermeiden, zb einen gewissen Jitter auf INTS 
aufzubringen, damit es eben vermieden wird, dass alle gleichzeitig 
aufgerufen werden sollen? Ob 1s oder 1,01s spielt keine Rolle.

Gruss,
Christian

von Dr. Sommer (Gast)


Lesenswert?

Wo ist denn das Problem, wenn mehrere INTs direkt hintereinander 
ausgeführt werden? der Cortex-M kann das sehr effizient, indem 
redundantes Register-Sichern/Wiederherstellen vermieden wird, somit 
sparst du so sogar ein bisschen Rechenleistung.

von Christian J. (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Wo ist denn das Problem, wenn mehrere INTs direkt hintereinander
> ausgeführt werden?

Ich hatte das Problem mal bei zwei Funkmodulen, die sich 
"synchronisierten" und ständig in die Quere kamen, weil beide losfunkten 
und der Empfänger platt gemacht wurde. Ok, andere Sache. Wenn das kein 
Problem ist, dann lasse ich es so. Ich möchte aber trotzdem sicher sein, 
dass kein Int den anderen unterbricht, weil da ein paar atome Dinge drin 
sind. Ich habe mal abgedreht einen Fehler zu suchen, der nur alle paar 
Stunden auftrat.

Weiss Du wie das geht dass keine nested ints passieren? Ich verwenden 
die Prio Group 4. Muss ich da explizit was machen oder ist das per 
default so?

von Dr. Sommer (Gast)


Lesenswert?

Christian J. schrieb:
> Weiss Du wie das geht dass keine nested ints passieren?

Ja, einfach allen Interrupts exakt die gleiche Priorität geben. Es 
reicht schon, wenn die Preemption Priority gleich ist, dass die 
Interrupts sich nicht verschachteln. Im ARMv7M Architecture Reference 
Manual gibt's da ein schönes Kapitel zu, wo das genau erklärt wird.

von Christian J. (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Ja, einfach allen Interrupts exakt die gleiche Priorität geben.

Ok. Ich habe bei der Init die Group 4 ausgewählt wo alle Bits dafür 
benutzt werde, also 1-15. Stelle ich die also zb alle auf 1 oder 
irgendeinen gleichen Wert (0 geht glaube ich nicht) dürfte das erledigt 
sein. Duie Sub Priority finde ich eher verwirrend.

von chris (Gast)


Lesenswert?

Christian J. schrieb:
> 1s, 10s, 60s sind ja auch alles Vielfache voneinander.

Und dafür verschwendest du 5 Timer?
Wie wäre es, in der ISR einfach einen Zähler zu inkrementieren?

von Dr. Sommer (Gast)


Lesenswert?

Christian J. schrieb:
> 0 geht glaube ich nicht

Doch, 0 geht auch, ist die höchste Priorität.

Christian J. schrieb:
> Duie Sub Priority finde ich eher verwirrend.

Lies das Manual, das wirkt Wunder, danach ist alles klar...

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.