Forum: Mikrocontroller und Digitale Elektronik AT91SAM9G10 AIC Interrupt ?


von Sascha (Gast)


Lesenswert?

Hallo, ich bin gerade dabei auf einem AT91SAM9G10 die Interrupts 
einzubinden.
Habe nur feststellen müssen, das der AIC (Advanced Interrupt Controller) 
etwas unzuverlässlich ist. Wird ein Interrupt aus irgendwelchen Gründen 
nicht richtig mit End Of Interrupt Command terminiert, so bleibt er 
hängen. Durch die Benutzung eines JTAG Debuggers habe ich schon den 
Protect Mode benutzt. Doch das Verwunderliche ist, auch nach einem Reset 
bleibt er hängen.
Als Massnahme schreibe ich gleich bei der Initialisierung des AIC den 
End Of Interrupt Command und lese danach das ID Register aus um zu 
sehen, ob noch ein weiterer nested Interrupt in der Pipeline steckt.
Es geht also mehr darum den Interrupt Controller zu resetten.
Im Betrieb kann das mit der Watchdog zwar abgefangen werden, jedoch muss 
der AIC wieder zum laufen gebracht werden.

Wer hat mit dem AIC Erfahrung ?
Und kann mir seine vorgehensweise erklären !

Gruß Sascha

von gerhard (Gast)


Lesenswert?

hallo sascha,
welches startup- bzw. welche lowlevelInit-Funktionen verwendest du?
in den von Atmel zur verfügung gestellten beispielen findest du die 
entsprechenden initialisuerung des aic bzw. einen irq-handler der auch 
nested interrupts unterstützt.

gruss
gerhard

von Sascha (Gast)


Lesenswert?

Hallo Gerhard,
ich habe es in Assembler selbst eingebunden nach den Beispielen von 
Atmel.
Das mit den nested interrupts ist kein Problem.
Aber gute Idee werde mir mal die librarys von Atmel ansehen.
Kann halt kein Linux oder CE nehmen, muss SIL2 Sicherheitslevel 
erreichen.
Und selbst wenn, muss ich zugeben würde mich Linux oder Win CE 
überfordern.

Das Problem findet dann statt, wenn der Interrupt nicht fertig 
ausgeführt wird, z.B. wenn man mit dem Debugger stoppt. Selbst durch 
einen Reset wird der Interrupt dadurch nicht mehr lebendig, weil der AIC 
immer noch auf dem einen Interrupt level steht.
Habe jetzt noch einige Stunden mit dem Debugger gearbeitet und es 
scheint so mit dem Workaround ganz gut zu gehen.

Aber immerhin bin ich durch den Grafikkontroller gut belohnt worden, ein 
klasse Teil.
Klar es gibt aber auch noch andere Chips mit ARM9 oder Cortex A.... aber 
nicht mit einer 9 Bit UART.


Gruß Sascha

von gerhard (Gast)


Lesenswert?

hallo sascha,
das was du als workaround bezeichnest ist die im datenblatt, kapitel 
"Protect Mode" empfohlene vorgehensweise wenn der protect mode verwendet 
wird (und den musst du aktivieren wenn du mit einem debugger arbeitest 
und dieser u.U. AIC User Interface liest).


gruss
gerhard

von Sascha (Gast)


Lesenswert?

Hallo Gerhard,
nein das Problem ist nicht der Protect Mode, sondern einfach nur das der 
Reset den AIC nicht richtig in Ausgangsstellung bringt.
Also muss ich per Software dafür sorgen, dass der AIC richtig leuft.
Wenn ich einen Reset erzeuge so stehen zwar alle Register des AIC auf 
den richtigen Werten, kann die per Software dann wieder konfigurieren 
aber der Interrupt bleibt mit dem Pending Register dann auch hängen.
D.H. das Register der Pending Interrupts zeigt an, das der Interrupt 
eingegangen ist, wird aber nicht ausgeführt. Weil der interne Sequencer 
mit dem nested Stack immer noch denkt ein Interrupt leuft gerade. Und 
genau dieses gilt es nach einem Reset zu leeren/löschen.
Es gibt keine Möglichkeiten den internen 8 Level Stack zu löschen !

Meine Lösung die ich habe funktioniert bis jetzt ganz gut, wollte aber 
mal hören, ob Andere zu dem Thema auch schon Erfahrungen gesammelt 
haben.

Gruß Sascha

von Hannes (Gast)


Lesenswert?

Hast Du den Interrupt Edge-triggered oder Level-triggered eingestellt?

Wenn bei Edge-Triggered die Flanke verlorengeht, ist der Interrupt in 
alle Ewigkeit "pending", wird aber nie ausgeführt.

von gerhard (Gast)


Lesenswert?

hallo sascha,
der protect mode ist ja auch kein problem sondern er ermöglicht das 
debuggen!

>Es gibt keine Möglichkeiten den internen 8 Level Stack zu löschen !
dann würde ich dir mal empfehlen das modul board_lowlevel.c aus den 
atmel beispien zu öffnen und nach diesem zeilen zu suchen:
1
// Unstack nested interrupts
2
for (i = 0; i < 8 ; i++) {
3
  AT91C_BASE_AIC->AIC_EOICR = 0;
4
}

gruss
gerhard

von Sascha (Gast)


Lesenswert?

Hallo Hannes,
hast du damit schon Erfahrung ?

>> Wenn bei Edge-Triggered die Flanke verlorengeht, ist der Interrupt in
>> alle Ewigkeit "pending", wird aber nie ausgeführt.

Oh das ist ja geradezu Systemgefählich für meine SIL2 Geschichte.
Ich habe einen externen Interrupt in der Tat auf Edge-Triggered 
eingestellt und mit dem Software Set Register den Interrupt testweise 
ausgelöst.
Pending bleibt er übrigens auch im Register bis der End Of Interrupt 
Command kommt. Ich habe immer gedacht, das bei verlorenem Interrupt in 
dem Fall Spurious Interrupt kommt.
Ich habe es auch ausprobiert mit verschiedenen Methoden, den Spurious 
Interrupt kommen zu lassen. Und es hat ohne Probleme funktioniert.
Aber irgendwie ist der AIC nicht ganz ausgereift, oder was 
wahrscheinlich eher der Fall ist, ich habe es noch nicht ganz 
verstanden.
Der AIC wird auf mehreren Produkten in der Form verwendet, somit kann er 
doch nicht so falsch sein !!!
Übrigens steht im Vector Register immer die Adresse des Spurious 
Interrupt, wenn kein anderer Interrupt aktiv ist.

Gruß Sascha

von gerhard (Gast)


Angehängte Dateien:

Lesenswert?

hallo hannes,
noch ein hinweis zum System-Interrupt im AIC:
der Source-Type muss auf High-Level und nicht auf die pos. Flanke
eingestellt sein da sonst der System Interrupt nach einiger Zeit nicht
mehr aktiv wird, wenn mehrere peripherals diesen Interrupt auch nutzen

im anhang eine präsentation zum aic wo auf einige details noch näher 
eingegangen wird.

gruss
gerhard

von Sascha (Gast)


Lesenswert?

Hallo Gerhard,
super das habe ich gesucht, habe aber die lowlevel Routinenen von Atmel 
noch nicht durchsucht. Ist aber klasse das diese Methode so erlaubt bzw. 
vorgeschlagen wird.

// Unstack nested interrupts
for (i = 0; i < 8 ; i++) {
  AT91C_BASE_AIC->AIC_EOICR = 0;
}

Uff dann bin ich ja auf der sicheren Seite.
Daran sieht man, dass es doch eine sehr einfach gestrickte Hardware ist.
Gruß Sascha

von Hannes (Gast)


Lesenswert?

>Uff dann bin ich ja auf der sicheren Seite.
>Daran sieht man, dass es doch eine sehr einfach gestrickte Hardware ist.
>Gruß Sascha

Na ja, wenn Du das meinst...

von gerhard (Gast)


Lesenswert?

>Uff dann bin ich ja auf der sicheren Seite.
>Daran sieht man, dass es doch eine sehr einfach gestrickte Hardware ist.
erlaube mir die frage:
wieviele jahre erfahrung als embedded software entwickler kannst du 
vorweisen um solche aussagen treffen zu können?

gruss
gerhard

von Hannes (Gast)


Lesenswert?

... und wieviele jahre erfahrung als embedded software entwickler kannst 
du vorweisen um Safety Integrity Level 2 zu entsprechen?

Traust Du Dir das wirklich zu?

Das ist schon nicht ohne...

von Sascha (Gast)


Lesenswert?

Hallo,
macht euch nur keine Sorgen über mich, ich mache das schon 26 Jahre 
lang.
Und wenn ein ARM9 schwierig ist, was ist dann ein Cortex A8 oder 
A9......
Ich komme eigentlich von der CISC Schiene her (R32C,M32C) und da ist die 
Hardware etwas aufwendiger gewesen, ist aber alles relativ, wie man es 
halt verstanden hat.
Jedenfals ist der AIC sehr einfach gegenüber anderen Controllern.
Dafür sind halt wieder andere Hardware Komponenten aufwendiger......

Und ich habe den Atmel auch nur eingesetzt weil er einen guten 
TFT-Controller und eine 9 Bit UART hat.
Die MMU ist natürlich für SIL2 Geschichten ein klasse Geschenk.

Gruß Sascha

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.