Forum: Mikrocontroller und Digitale Elektronik NVIC Priority grouping CORTEX M3


von Lars (Gast)


Lesenswert?

Hallo, nachdem ich schon länger mit den STM32 arbeite, wollte ich mich 
mal näher mit der Materie Cortex M3 auseinandersetzen. Dank IDE und Libs 
ist das zwar nicht unbeding nötig, aber wohl schon ganz gut wenn man mal 
vor einem Problem steht... Ich durchforste dazu die ARM Ref Manuals und 
komme an der Stelle Priority Grouping nicht ganz zurecht. Ich vermute 
das Thema verstanden zu haben. Allerdings verstehe ich den Sinn dahinter 
nicht. Es heißt ja, dass das PRI_N-Feld in Prioritäten und 
Subprioritäten aufgeteilt werden kann. Haben zwei Exeptions die gleiche 
Prio, enstscheidet die Subprio. Wie die Aufteilung ist wird im 
PRIGROUP[2:0]-Feld eingestellt. Im Prinzip habe ich durch das PRI_N-Feld 
doch IMMER 256 Möglichkeiten, egal wie ich es aufteile. Wozu also das 
Ganze? Ich übersehe doch irgendetwas.

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0337e/ch05s03s02.html

Danke und Gruß

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Eine Priorität hat immer 4 Bit.

Diese können dynamisch auf Primary und Sub unterteilt werden.

Beispiel:
Gruppenvergabe 2 zu 2 Bit

Somit kann Pirimary den Wert 0..3 und Sub auch 0..3 erhalten.

Beispiel:
ISR1 Pri 1 / Sub 1
ISR2 Pri 2 / Sub 1
ISR3 Pri 2 / Sub 2

Wenn jetzt ISR1 kommt, dann wird der aufgerufen. Kommt während dem ein 
ISR2 dann darf der den ISR1 unterbrechen, da er eine höhere Primary 
Wertigkeit hat.

Wenn ISR2 bereits aktiv ist, so darf ISR3 diesen nicht unterbrechen, 
ISR1 ebenfalls nicht.

Wenn ISR2 und ISR3 gleichzeitig kommen, so wird zu erst ISR3 bearbeitet, 
anschließend ISR2.

von (prx) A. K. (prx)


Lesenswert?

Wenn innerhalb einer Gruppe mehrere Request gleichzeitig anstehen, dann 
gewinnt beim Aufruf der ISR derjenige mit numerisch kleinster Prio. Der 
Rest folgt hintereinander in der von der Prio vorgegebenen Reihenfolge. 
Es wird keine ISR von einem anderen Interrupt innerhalb dieser Gruppe 
unterbrochen. Auch dann nicht, wenn die Subprio numerisch kleiner ist.

Hingegen wird eine ISR von einem anderen Interrupt unterbrochen, wenn 
der einer numerisch kleineren Gruppe angehört (preemption priority).

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Markus Müller schrieb:
> Wenn jetzt ISR1 kommt, dann wird der aufgerufen. Kommt während dem ein
> ISR2 dann darf der den ISR1 unterbrechen, da er eine höhere Primary
> Wertigkeit hat.

Die Prios sind wie so oft auch bei den Cortexen numerisch invers zur 
Bedeutung, d.h. eine kleinere Zahl steht für höhere Priorität.

: Bearbeitet durch User
von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Dann habe ich das wohl vertauscht ... (ich vergesse das immer)

von Lars (Gast)


Lesenswert?

OK... danke das war das Fitzelchen, was mir gefehlt hat. Nur eine hühere 
Prio nicht aber eine höhere Sbprio darf unterbrechen...
danke leute

von Carsten (Gast)


Lesenswert?

Nur als Anmerkung:
An dieser Stelle unterscheiden sich auch die Implementierungen der 
Hersteller. Hier hat ARM etwas Flexibiliät eingeräumt.
Der STM32 z.B. hat 16 Prio-level (also 4 Bit), die Infineon XMC4000 
haben 64 Level.

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.