Forum: Mikrocontroller und Digitale Elektronik ARM Cortex M4 Interrupt Synchronisation


von MicroFrickler (Gast)


Lesenswert?

Hallo Leute, habe folgendes Problem.

Ich soll ein Programm Debuggen, wo vorher ein Entwickler das Kunststück 
vollbracht hat, das ganze Programm ohne Main-Schleife nur in Zeit- oder 
Nachrichtenereignis gesteuerte Interrupts auszuführen.

Wenn alles per Interrupt gesteuert wird, dann gibt es im Grunde 
eigentlich gar kein richtiges Interrupt-Verhalten mehr in der 
Programmausführung, weil ein Interrupt ja eigentlich ein statisch 
ablaufendes Programm dynamisch unterbrechen soll.


Ich benutze den Prozessor TM4C123AHP6M von TI, als Libraries die 
Routinen, die CSS und TIVAWARE zur Verfügung stellen.

Ich will ein Verhalten erreichen, dass ein Interrupt, der den 
UART-ISR-Handler aufruft, alle anderen laufenden ISR-Handler unterbricht 
bei der Ausführung, wenn möglich.

Oder wird das so oder so schon gemacht, dass ein ISR-Handler gestoppt 
wird und ein anderer ausgeführt wird?

Und / oder will ich, dass der UART-ISR-Handler bei der Auführung dann 
nicht unterbrochen wird.

Also soll folgendes passieren:

- der UART-ISR-Handler soll sofort ausgeführt werden, auch wenn andere 
ISR-Handler laufen

- wenn der ausgeführt wird, soll er nicht unterbrochen werden


Ich hoffe und bin dankbar für hilfreiche Antworten, denn das ist zum 
Verzweifeln, wenn man ein Programm retten soll, dass schon von 
vornherein sämtliche Eigenarten eines Mikrocontrollers nicht 
berücksichtigt bezüglich Timing/Synchronisation von Interrupts und dass 
der Entwickler sich viel zu sehr auf die Korrektheit und Robustheit 
aller gelieferten Funktionen und deren Geschwindigkeit verlassen hat.

von Jim M. (turboj)


Lesenswert?

Schau Dir mal den NVIC genauer an.

Du kannst obiges Problem lösen, indem Du dem Uart IRQ die Priorität 0 
(NULL) und den restlichen eine höhere Nummer (=geringere Priorität) 
gibst.

von (prx) A. K. (prx)


Lesenswert?

Gib dem Händler höchste Priorität und fertig.

von MicroFrickler (Gast)


Lesenswert?

Das mit der Priorität hat ein Kollege von mir so erklärt, dass der nur 
zum Tragen kommt, wenn zwei Interrupts extrem zeitnah auftreten und 
daher der NVIC (Interrupt Controller) nach der Priorität entscheiden 
soll, welcher ausgeführt wird.

Könnt ihr garantieren, dass die Priorität auch dafür sorgt, dass der ISR 
des höher priorisierten Interrupts immer vorrang bei der Ausführung hat 
und nicht nur bei zeitlichen Kollisionen?

von m.n. (Gast)


Lesenswert?

MicroFrickler schrieb:
> Könnt ihr garantieren, dass die Priorität auch dafür sorgt, dass der ISR
> des höher priorisierten Interrupts immer vorrang bei der Ausführung hat
> und nicht nur bei zeitlichen Kollisionen?

Ich kann Dir eine Versicherung anbieten. Mit € 499/Jahr garantiere ich 
es Dir.

von MicroFrickler (Gast)


Lesenswert?

m.n. schrieb:
> MicroFrickler schrieb:
>> Könnt ihr garantieren, dass die Priorität auch dafür sorgt, dass der ISR
>> des höher priorisierten Interrupts immer vorrang bei der Ausführung hat
>> und nicht nur bei zeitlichen Kollisionen?
>
> Ich kann Dir eine Versicherung anbieten. Mit € 499/Jahr garantiere ich
> es Dir.


Kein Thema, ich weiß um eure sichere Kompetenz. Ich habe es auch gerade 
im Dateblatt nachgelesen, was hier geschrieben wurde.

von Dr. Sommer (Gast)


Lesenswert?

MicroFrickler schrieb:
> Das mit der Priorität hat ein Kollege von mir so erklärt, dass der nur
> zum Tragen kommt, wenn zwei Interrupts extrem zeitnah auftreten und
> daher der NVIC (Interrupt Controller) nach der Priorität entscheiden
> soll, welcher ausgeführt wird.

Das gilt nur für die Subpriority. Die Preemption Priority erlaubt es 
dir, dass ein Interrupt einen anderen unterbrechen kann. Dafür steht das 
N in NVIC - Nested Vectored Interrupt Controller. Der ist explizit 
dafür ausgelegt, dass ein Interrupt einen anderen unterbrechen kann. 
Lies es doch einfach im ARMv7M Architecture Reference Manual nach, da 
steht das ganz genau beschrieben, ohne dass man sich auf vages 
Halbwissen von Kollegen verlassen müsste.

MicroFrickler schrieb:
> Ich soll ein Programm Debuggen, wo vorher ein Entwickler das Kunststück
> vollbracht hat, das ganze Programm ohne Main-Schleife nur in Zeit- oder
> Nachrichtenereignis gesteuerte Interrupts auszuführen.
Also eine sehr elegante und (energie)effiziente asynchrone reaktive 
Programmierung.

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.