Forum: Compiler & IDEs Interrupt Vektortabelle überschreiben?


von Andy S. (1632andys)


Lesenswert?

Hi,

gibt es eine möglichkeit die Main-Funktion eines C Programs, dass auf
einen ATmega8 laufen soll, in den Interrupt-Vektor-Bereich
unterzubringen.

Es handelt sich hier um einen rein konzeptionelle Frage.

Auf das Problem bin ich gestoßen, als ich mir den Source-Code des KAVR-
Bootloaders angesehen habe.

http://www.mikrocontroller.net/articles/Kavr:_AVR_Hexfile_Boot_Loader

Hier wird z.B. auf die Interrupttabelle verzichtet um so speicherplatz 
zu sparen. In Assembler ist das natürlich kein problem.

Ich interessiere mich hier aber ausdrücklich für den C Syntax.

Durch die Verwendung der Attribute section und naked ist zwar eine
verschiebung an den Anfang des Programs möglich, jedoch wird die
Vektor-Tabelle in allen Fällen vom Compiler angelegt.

Betrachtet man jedoch den Deassemblierten Code des KAVR, wird das nicht
gemacht.

Liegt das an der Verwendung eines speziell angepassen Make-Files?

Hab dazu leider nix explizites im Forum bzw. im Internet oder in der
avr-lib 1.8.0 gefunden.

Verwende AVR Studio 5.1.208 mit AVR GCC 3.3.1.27

-Andy

von Karl H. (kbuchegg)


Lesenswert?

Andy S. schrieb:

> Liegt das an der Verwendung eines speziell angepassen Make-Files?

Schau halt ins makefile rein, das beisst nicht.

1
#
2
# Anything below should NOT require modification
3
# ==============================================
4
#
5
PROJECT  = kavr
6
LFLAGS   = -Wl,-Ttext,$(BOOTADDR),--relax -mmcu=$(MCU) -nodefaultlibs -nostartfiles
7
CFLAGS   = -g -Os -fno-inline-small-functions -Wall -mmcu=$(MCU) -I. -DF_CPU=$(F_CPU) -DTIMEOUT=$(TIMEOUT) -DBAUD=$(BAUD) -DBOOTADDR=$(BOOTADDR)
8
AVRDUDE  = avrdude $(DUDEPORT) -p $(MCU) -y -u 
9
OBJS     = kavr.o

welche der Optionen sieht für ein normales Programm seltsam aus?
Ich würde mal schätzen, dass für ein reguläres 08/15 Programm die 
Linker-Optionen "-nodefaultlibs -nostartfiles" wohl nicht zielführend 
sein werden.

Also würde ich ganz einfach mal ausprobieren was passiert, wenn ich die 
wegmache.

von Andy S. (1632andys)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Also würde ich ganz einfach mal ausprobieren was passiert, wenn ich die
> wegmache.

Das Entfernen von -nostartfiles führt zu

undefined reference to `main'
undefined reference to `exit'
address 0x202c of kavr.elf section .text is not within region text

bzw.

-nodefaultlibs zu

address 0x202c of kavr.elf section .text is not within region text

Ist es also so, dass der eigentliche Grund für das Anlegen der 
Interrupttabelle nicht im Quellcode sondern im verwendeten Makefile zu 
suchen ist?

D.h. durch eine Anpassung des Makefiles ist es möglich die 
Interrupttabelle zu überschreiben?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Andy S. schrieb:
> jedoch wird die
> Vektor-Tabelle in allen Fällen vom Compiler angelegt.

Nein, sie kommt aus dem crt*.o-File der Bibliothek.  Und wie du nun
ganz richtig vermuten wirst, erreichst du mit -nostartfiles, dass
genau diese Datei nicht gelinkt wird.

In so einem speziellen Fall wäre es aber sinnvoller, sich die
Startdatei selbst in Assembler zu schreiben und dann den Linker mit
der Hand (statt vom Compiler getrieben) aufzurufen.  Du weißt selbst
am besten, welche der normalerweise stattfindenden Start-Aktionen
du brauchst:

. Setzen des Stackpointers
. Kopieren der statischen Variablen aus dem Flash in den zugehörigen RAM
. Ausnullen des .bss (nicht explizit initialisierte Variablen)
. Aufruf von main(), Aufruf von exit() mit dem Rückkehrwert von main()

Je nach Anwendung lassen sich alle diese Teile so weit reduzieren
(die Initialisierung des Stackpointers natürlich nur bei den AVRs,
bei denen er durch die Hardware bereits passend initialisiert wird),
dass ggf. nur noch ein «RJMP main» übrig bleibt.

von Andy S. (1632andys)


Lesenswert?

OK Danke soweit!
Jetzt weiß ich wo ich ansetzten muss um das ganze zu verstehen.

-Andy

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.