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
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
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
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
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
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.
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:
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
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
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
>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...
>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
... 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...
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