www.mikrocontroller.net

Forum: Compiler & IDEs Fragen zu Interrupts mit (win)avr-gcc


Autor: z0ttel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich beschäftige mich bei einem kleinen Projekt mit dem Thema
Interrupts. Um erkennen zu können, ob ich offene Interruptquellen im
System habe, habe ich mir ein Paket an Interrupthandlern
zusammengeschrieben, welche jeden IRQ auf meiner MCU (ATmega169)
abfangen und merken. Dass sich im Moment das System nach einem IRQ in
einer Endlosschleife befindet, soll für meine Frage nebensächlich
sein.

Der angehängte Sourcecode sollte recht verständlich sein. Sobald ein
IRQ auftritt, ruft die zugehörige ISR (SIGNAL(IRQ)) die einen
dummyHandler mit der Interruptquelle als Parameter auf. Danach läuft
das System in eine Endlosschleife und man kann sich in Ruhe den letzten
IRQ mit einem Debugger anschauen. Soweit so gut.

An der ganzen Sache sind mir zwei Sachen (unangenehm) aufgefallen:

1. avr-gcc meckert bei Compilieren über die an das SIGNAL()-Makro
übergebenen Parameter (warning: `SIG_xxx' appears to be a misspelled
signal handler)

2. Der Objektcode ist nahezu explodiert. Wenn ich o.g. Verfahren für
alle Interrupts des ATmega169 einsetze, wächst der Code um ~1700Bytes:

ohne isr.c:
AVR Memory Usage:
-----------------
Device: atmega169

Program:     462 bytes (2.8% Full)
(.text + .data + .bootloader)

Data:         42 bytes (4.1% Full)
(.data + .bss + .noinit)


mit isr.c:
AVR Memory Usage:
-----------------
Device: atmega169

Program:    2174 bytes (13.3% Full)
(.text + .data + .bootloader)

Data:         44 bytes (4.3% Full)
(.data + .bss + .noinit)


Ist das normal? Gibt es evtl. einen resourcenfreundlichen Weg, den ich
bis jetzt noch nicht sehe?


Gruß,
z0ttel

Autor: z0ttel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Anhang vergessen -- sorry

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guck dir doch mal den generierten Assemblercode an.

Durch den Aufruf einer Funktion in der ISR zwingst du den Compiler zu
einer PUSH/POP-Orgie, da er alle Register, die gemäß ABI durch die
gerufene Funktion zerstört werden dürfen, zusätzlich retten muss.  Das
sollte die Code-Explosion erklären.

Ich weiß nicht, ob dir mit _vector_default eventuell schon geholfen
wäre, allerdings gibt's glaub' ich keine Möglichkeit herauszufinden,
welcher Interrupt dann zugeschlagen hat.  Andererseits: wenn du
nicht weißt, welcher Interrupt auftreten kann, dann sitzt das Problem
eher vor der Tastatur als im Controller...

Als Alternative zu den geschachtelten Funktionsaufrufen kannst du
natürlich die Vektoren in einem Assemblerfile implementieren, dort
eine Zahl in ein Register eintragen und danach woanders hin springen.

Das ,Meckern' über die Signalnamen ist der Versuch, im Compiler
Fehler
in der Schreibweise der Interruptvektoren abzufangen.  Die
SIG_xxx-Namen werden in <avr/io.h> definiert, hast du die denn auch
includet?  Andernfalls wäre die Bemerkung völlig zu Recht. ;-)

Die signal.h heißt übrigens <avr/signal.h>.  Mit avr/ davor und in
Spitzklammern.

Autor: z0ttel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Jörg,

erstmal Danke für Antworten.

Zu 1) Das ISR-Modul habe ich zum debuggen während der Entwicklung
geplant. Sobald der Code 'fertig' ist, fliegt es zumindest teilweise
raus. Da ich allerdings recht neu beim AVR bin, habe ich bewusst das
'aufgeblasene' Design gewählt, um eben einen besseren Überblick zu
behalten (für den Fall, dass sich der Controller doch mal anders
verhält als erwartet). Im 'Serien'code würde dann der default-Vector
vollkommen reichen, da gebe ich Dir Recht.

Zu 2) Stimmt, jetzt wo Du es sagst: die io.h wird in dem Modul nicht
inkludiert, deswegen die Meckerei. Nach der Änderung ist alles gut :)

Zu 3) Ich habe das makefile so geändert, dass ich das avr/ nicht mehr
brauche -- ist das mit den Spitzklammern Pflicht?


Greetz,
z0ttel

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Zu 3) Ich habe das makefile so geändert, dass ich das avr/ nicht
> mehr brauche
Sollte man lieber nicht machen. Dadurch wird dein Code unportabel und
für andere schwerer benutzbar.

> ist das mit den Spitzklammern Pflicht?
Ja, die sind Pflicht. Anführungszeichen und spitze Klammern sagen dem
Compiler, wo er die Datei zu suchen hat.
Faustregel: Header, die man nicht selbst geschrieben hat in spitze
Klammern, nur selbstgeschriebene in Anführungszeichen setzen.

Autor: z0ttel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Chris,

ok, unter den Gesichtspunkten habe ich die Angelegenheit noch nicht
betrachtet -> 'old habbits die hard'.

Ich gelobe hiermit Besserung ;) danke für die Aufklärung

cu
z0ttel

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.