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:
1 | // Unstack nested interrupts
|
2 | for (i = 0; i < 8 ; i++) { |
3 | AT91C_BASE_AIC->AIC_EOICR = 0; |
4 | }
|
gruss gerhard
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.