Forum: Mikrocontroller und Digitale Elektronik Interruptfreigabe beim ARM


von botro (Gast)


Lesenswert?

Hallo miteinander, ich habe mal ne Frage zum Interrupt beim ARM7 mit
Winarm. Ich verwende ein Olimex LPC2148 Board und bin blutiger Anfänger
was ARM und GNUARM betrifft (und deshalb noch nicht so richtig weiter
gekommen).
Also meine Frage ist folgende: ich versuche eine einfache ISR zu
schreiben, sowas wie LED blinken lassen. Aber mein Verständnis ist da
noch nicht ganz so weit, da ich ja unter anderem das IRQ-Bit im CPSR
auf 0 setzen muss, damit dieser Interrupttyp aktiv wird. Aber wie mache
ich das? Solange ich im User-mode bin, bekomme ich doch keinen Zugriff
auf dieses Bit, muss ich nun in einen priviligierten Modus wechseln
(wenn ja, wie) oder entsinne ich mich falsch, und ich kann das Bit
jeder zeit mittels MSR und MRS lesen und schreiben.

von Daniel Madre (Sierra) (Gast)


Lesenswert?

Über Interrupts weis ich zwar auch noch sehr wenig, aber die Seite hier
hat mir echt schon viel geholfen:
http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/index.html

von Dietmar (Gast)


Lesenswert?

@botro:

Auf der Keil Homepage gibt es eine Menge Beispiele zu den
LPC2000-Controllern. Ich empfehle dir, da das Beispiel "Blinky IRQ"
zu downloaden. Es initialisiert einen IRQ Interrupt am VIC mit einem
Timer, wobei bei Erreichen eines Timerwertes eine LED an einem Port
verändert wird:

http://www.keil.com/download/list/arm.htm

Dort anklicken:

Philips LPC2100 Blinky IRQ Example

Ich hoffe, das hilft etwas.

Wenn dein Programm später läuft, bist du immer im USER Mode. Man kann
aus diesem Status manuell nie mehr in einen anderen Mode wechseln,
außer nach Hardware- oder Watchdog-Reset oder aus einem anderen Mode
heraus (SWI, IRQ, FIQ z.B.).

Was willst du denn mit den Bits im CPSR?

Ist dein Interrupt initialisiert, so verzweigt das Programm bei einem
Ereignis z.B. in den IRQ Mode und kehrt danach in den USER Mode zurück.
Mit dem CPSR oder SPSR hast du da nichts zu tun. Das ist nur für
erweiterte Core-Programmierung interessant (z.B. Nested Interrupt
Technik oder Spurious Interrupt Handling).

Gruß

Dietmar

von A.K. (Gast)


Lesenswert?

"Wenn dein Programm später läuft, bist du immer im USER Mode"

Sicher?

von Dietmar (Gast)


Lesenswert?

A.K.:

>Sicher:

Wenn du kein RTOS und System Mode oder ähnliches verwendest, sondern
nur die Keil Startup: JA!!!

Dietmar

von Martin Thomas (Gast)


Lesenswert?

zur als Ergaenzung:
Freigabe fuer IRQ und FIQ in den Statusregistern der verschiedenen Modi
erfolgt in vielen Faellen im Startupcode zusammen mit der Einstellung
der verschiendenen Stackpointer. Zuallererst also im Startup-Code
schauen. Im einfachsten Fall kann man  dort die Interrupts auf
"Core-Level" aktivieren und ist schon fertig. Alles weitere dann
mittels Interrupt-Controller (nicht VIC/AIC...). Schreiben/aendern der
Bits wird im User-Mode unterbunden. Folglich im Prinzip drei
Moeglichkeiten (vielleicht auch mehr, aber die fallen mir auf Anhieb
ein):
* IBIT und FBIT schon im Startup passend einstellen. Dann ist von
Anfang an freigesschaltet, egal ob User oder andere Mode (z.B. so
gemacht in den meisten Beispielcodes von Keil)
* Anwendung nicht im User-Mode laufen lassen. Der User-Mode bringt
nicht so viel an zusaetzlichem Schutz ohne "richtiges OS" und
entsprechende Speicherverwaltung in der Hardware. Schreibzugriff ist
dann jederzeit moeglicher, da das Programm ohnehin in previligiertem
Modus laueft. (findet man in einigen "nicht-Keil" Beispielen)
* Interrrupts auf Core-Level in einer Routine de-/aktivieren, die per
SWI gerufen wird. SWI-call wechselt implizit in einen previligierten
Modus und ruft die Routine deren Adresse im SWI-Execption-Vector
eingestellt ist. Biete somit ein "Schlupfloch" aus dem User-Mode. Man
kann in der ISR dann "machen was man will" (z.B. so gemacht in einigen
Beispielen von Sharp und Oki).

In meinen portierten bzw. selbstgebastelten Codes der
WinARM-Beispielsammlung auf den bereits genannten
siwawi/arm_projecst-Seiten findet sich von allem etwas zur Inspiration.
Im Moment grade halbwegs aktuelle:
- Portierung des Example-Code-Bundles fuer LPC213x/4x auf
GNU-Toolchain. Diese Portierung enthaelt auch einiges an von mir
"verbrochenem" neuen Code und Anpassungen/Korrekturen u.a.
Vorbereitung fuer SWI nebst Beispiel.
http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/lpc2k_bundle_port
- "gamma"-Beispiel fuer AT91SAM7, nicht vom Controllertypen
abschrecken lassen, ist auch ein ARM7TDMI und Codeteile mit Bezug auf
SR/IBIT/FBIT und SWI sind leicht portierbar.
http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/index_at91.html#at91_gamma

Falls man nicht nur aus Beispielen abschauen will: Auf arm.com gibt es
viele brauchtbare Dokumente.

Martin Thomas

von Dietmar (Gast)


Lesenswert?

@Martin Thomas:

>* IBIT und FBIT schon im Startup passend einstellen. Dann ...

Ist bei Keil schon erledigt.

>* Anwendung nicht im User-Mode laufen lassen.

>* Interrrupts auf Core-Level in einer Routine de-/aktivieren, die per
SWI gerufen wird.....

Den SWI zum Zugriff auf das CPSR kann man auch aus dem USER Mode
natürlich immer rufen...

Kein USER Mode: Hier gibt es anscheinend neue Aspekte zum Betrieb des
ARM Controllers?

Bin da sehr interessiert.

Natürlich, kann ich die Keil Startup so verändern, daß der Controller
nicht in den USER Mode gelangt. Aber, was bringt das im Detail an
positiven Errungenschaften in der End-Applikation, was ich im USER Mode
nicht habe? Ich meine, der Mode hat doch eine Daseinsberechtigung, oder?
Was hat man im anderen Mode denn für Vorteile?

>Falls man nicht nur aus Beispielen abschauen will:

Beispiele helfen aber ungemein. Ohne z.B. das FullCAN Beispiel oder
Blinky IRQ, jetzt mal stellvertretend für die vielen anderen Beispiele
der Hersteller, ist so mancher ARM Neuling teilweise ganz schön
aufgeschmissen, um nicht zu sagen, verloren.

Natürlich hat ein ernsthafter ARM User die Downloads von der ARM
Homepage. Was es dort aber nicht gibt, ist das äußerst interessante und
hilfreiche "ARM ARM", das ARM Architecture Reference Manual. Gibt es
eine Möglichkeit, das hier ins Forum zur allgemeinen Verwendung
hochzuladen (ca. 14 MB) oder einen Link zu posten?

Gruß

Dietmar

von botro (Gast)


Lesenswert?

Erstmal schönen Dank für die reichlichen Antworten. Ich selbst konnte
die letzten Tage leider nicht so richtig mitdiskutieren, da mein
Inet-Zugang defekt war. Meine Frage ist aber gut beantwortet worden,
das hilft mir sehr weiter.
Als kleine Ergänzung, das "ARM ARM" kann man durchaus nach einigem
suchem in Netzt finden. Es wird auf einer Seite bei ARM zum kostenlosen
Download angeboten. Ich habe den Link aber leider nicht mehr und die
Seite ist etwas versteckt. Also nicht so schnell aufgeben beim suchen.

Nochmal vielen Dank an alle Antworter,

botro

von Dietmar (Gast)


Lesenswert?

@botro:

"ARM ARM" gibt es bei ARM eben nicht mehr, sondern nur das Buch. Wenn
du einen Link direkt zu ARM gefunden hast, bitte her damit!

Gruß

Dietmar

von Dietmar (Gast)


Lesenswert?

@botro:

Das Beispiel Blinky IRQ für den LPC2129 auf dem MCB2100 Board gab es am
Anfang sogar von Keil nur für GCC, da die aus GCC ihren Compiler weiter
entwickelt haben, habe es als eines der ersten Beispiele erfolgreich
verwendet.

Gruß

Dietmar

von Dominic R. (dominic)


Lesenswert?

Google: "ARM ARM" site:arm.com

Da gibt's als Hit eine Page mit ner EULA für das ARM ARM, wenn man die
akzeptiert bekommt man das PDF.

Gruss,

Dominic

von botro (Gast)


Lesenswert?

@Dominic

Danke

von Dietmar (Gast)


Lesenswert?

@Dominic:

>Da gibt's als Hit eine Page mit ner EULA für das
>ARM ARM, wenn man die akzeptiert bekommt man das PDF.

Das scheint jetzt neu, die haben sich anscheinend gebessert :-)

Gruß

Dietmar

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.