Forum: Mikrocontroller und Digitale Elektronik AT91SAM7S + YagartoIDE Interrupts benutzen


von Mirko (Gast)


Lesenswert?

hallo.
habe mit Eclipse (YagartoIDE) nach der anleitung (Using Open Source 
Tools for AT91SAM7S Cross Development, Revision C) die 
entwicklungsumgebung eingerichtet. flashen und linken klappt alles.
jedoch mit den interrupts klappt es noch nicht.
irgendwie wurde die ganze interruptgeschichte in CRT.S ausgelagert (oder 
verstehe ich das falsch?).
habe davor IAR benutzt und da mußte man z.b mit:

AT91F_AIC_ConfigureIt (AT91C_BASE_AIC,
                       AT91C_ID_SYS,
                       6,
                       AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,
                       DBGU_irq_handler);

die interruptroutine angeben und dann die routine "DBGU_irq_handler" 
definieren.

wie läuft das jetzt mit CRT.S in Eclipse? ich habe die 
lib_AT91SAM7S256.h auch in das projekt eingebunden.



von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Die "Interruptgeschichte" wird in Jim Lynchs Tutorial durch einen 
Assembler-Wrapper in der crt0.s implementiert. Ist der übliche Ansatz 
wie auch in vielen Atmel AT91 Beispielen (auch für IAR). Im C-Code muss 
man dann nichts besonderes (compilerspezifisches) beachten. ISR einfach 
wie eine "normale" Funktion programmieren. Objekt-Datei aus crt0.s 
einfach anlinken. lib_at91 hat mit dem eigentlichen IRQ-Handling nichts 
zu tun. Beim Datanaustausch die üblichen Vorkehrungen treffen 
(volatiles, Zugriffe "atomic" falls erforderlich, etc.). Volatiles 
wurden in einigen AT91 Beispielcodes gerne vergessen, der IAR-Compiler 
scheint wohl etwas toleranter bei solchen Fehlern - es sind aber dennoch 
Fehler. Weitere Hinweise ohne genauere Beschreibung von "klappt das noch 
nicht" etwas schwierig.

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Nachtrag. Grade nochmal etwas über den Beispielcode aus J. Lynchs 
Tutorial geschaut. ARM-core IRQ-Exceptions sind beim Start deaktiviert 
(vgl crt0.s : msr   CPSR_c,#ARM_MODE_SYS|I_BIT|F_BIT). Evtl. einfach nur 
ein enableIRQ() in main() nachtragen (vgl. Rest des Beispielcodes).

von Mirko (Gast)


Lesenswert?

enableIRQ() , das ist es!!!!!
danke, lob und 
anerkennung!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

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.