Forum: Mikrocontroller und Digitale Elektronik ARM - Frage zu IRQ_STACK_SIZE (AT91sam7a3)


von Max (Gast)


Lesenswert?

Hallo Forumskollegen,

Ich bin gerade dabei mich in die ARM-Programmierung einzuarbeiten. 
Derzeit versuche ich zu verstehen was in dem mir vorliegenden 
Startupfile passiert, und ich bin ganz am Anfang auf eine Konstante 
gestoßen welche folgendermaßen definiert ist:
1
#define IRQ_STACK_SIZE 8*3*4

Folglich dürfte für den Interruptstack ein Bereich von 96 Bytes 
reserviert werden.
Meine Frage ist jetzt, wie man auf diesen Wert kommt, bzw. welche Daten 
werden auf dem Interruptstack tatsächlich abgelegt?

Ich hoffe, dass diese Frage nicht ganz zu dämlich ist, nur habe ich im 
Datenblatt bzw. diversen Application Notes noch keine Information über 
den Ursprung dieses Werts gefunden.

Ich wäre für eure Hilfe sehr dankbar,

Viele Grüße

Max

von Max (Gast)


Lesenswert?

Ist die Frage wirklich so dämlich dass ich keine Anwort bekomme :-)

von lowlevel (Gast)


Lesenswert?

Hallo,

die Frage ist nicht dämlich. Das richtige Verständnis der Vorgänge ist 
nie ganz einfach zu erlangen ;-D. Ein ARM Prozessor hat wie 
Beispielsweise ein Computerprozessor (80x86) eine komplexere 
Interrupt-Architektur als Beispielsweise ein kleiner AVR Controller. 
Beim ARM gibt es sogenannte Exceptions. Folgende sind in der 
Exception-Vector-Table definiert:

1. 0x00 Reset
2. 0x04 Undefined Instruction
3. 0x08 Software Interrupt
4. 0x0C Prefetch Abort
5. 0x10 Data Abort
6. 0x14 0
7. 0x18 IRQ
8. 0x1C FIQ

Diese Tabelle gibt sozusagen an, an welche Adresse beim Auftreten einer 
Exception gesprungen wird. Beim Reset an den Anfang des Speichers 
0x00000000 und so weiter. An den entsprechenden Adressen sollten dann 
Funktionen (Handler) aufgerufen werden, die die Exception behandeln. 
Zusätzlich kennt der ARM Controller verschiedene Modi. Bei einem Wechsel 
in einen anderen Modus werden verschiedene Arbeitsregister sowie 
Stackpointer und Linkregister gespeichert. Dies geschieht sehr schnell. 
Somit ergibt sich für jeden Modus ein anderer Stackpointer und somit ein 
anderer Stack. Das DEFINE das du ansprichst wird im späteren Verlauf 
deines Programms dazu verwendet Speicherbereich zu reservieren in dem 
später der "IRQ Stack" liegt. 96 Bytes sind zwar nicht allzu viel, für 
den IRQ Stack aber unter Umständen (keine Nested Interrupts, einfache 
ISRs) ausreichend.

WICHTIG: Das DEFINE Statement ist eine Precompiler / "Preassembler" 
Direktive. Du kannst es so verstehen, dass noch vor dem Compilieren (im 
Falle von C) bzw. vor dem Assemblieren überall dort wo IRQ_STACK_SIZE 
steht die Zahl 96 hingeschrieben wird. Das wirkliche Anlegen des Stacks 
(reservieren von Speicher, setzen des Stack Pointer) geschieht an 
anderer Stelle durch Verwendung dieses Labels.

Detaillierte Informationen zur Funktionsweise eines ARM Controllers 
findet sich im "ARM Architecture Reference Manual" (ARM ARM).

Ich hoffe das Hilft ;-D
Gruß lowlevel

von Max (Gast)


Lesenswert?

Hallo,

Vielen Dank für die überaus hilfreiche und detaillierte Antwort!

Viele Grüße

Max

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Nur in Ergänzung zu den Informationen von "lowlevel":

Bei den Beispielen von Atmel ist zu beachten, dass im IRQ-Handler der 
Betriebsmode gewechselt wird (und damit auch auf einen anderen Stack), 
daher wird nur relativ wenig Platz für der IRQ Stack benötigt. Im 
Beispiel kommt die Konstante im define von: 3 words [für Status, Link 
und ein "scratch"] * 8 priority level [max] * 4 bytes[per word]. Das 
Dokument "Interrupt Management: Auto-vectoring and Prioritization" von 
Atmel beschreibt das ganz gut für den Einstieg (ist etwas älter aus der 
vor-AT91SAM*-Zeit).

Mit einem einfachen Handler, wie z.B. im Dokument "Getting Started with 
AT91SAM7S Microcontrollers" von atmel.com beschrieben und auch in vielen 
Beispielen und Dokumenten anderer Hersteller zu finden, ist u.U. 
deutlich mehr Platz für den IRQ-Stack vorzusehen.

Das Infocenter von ARM ist ebenfalls einen Blick wert. Dort findet man 
allerdings, wie in ARM ARM auch, wenig spezifisches zu Controllern 
bestimmter Hersteller (z.B. AT91SAM7A3 und dessen AIC), dafür allerdings 
sehr viel zu den Architekturen und "Kernen" (z.B. ARM7TDMI und 
Exceptions).

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.