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
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.
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.