mikrocontroller.net

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


Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#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

Autor: Max (Gast)
Datum:

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

Autor: lowlevel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Viele Grüße

Max

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.