Hallo, für ein Projekt muß ich die Startadresse des Programms verschieben. Dazu muß ich mein Makefile um den Linkeraufruf erweitern. (Die vermutlichen Optionen habe ich schon eingesetzt) Würde mir bitte jemand mal freundlicherweise sagen, was ich wo noch eintragen muß ? Im Anhang mal das Makefile. PS: Ich hatte schon überlegt ein anderes Makefile zu nehmen, aber mit diesem hatte ich bisher keine Probleme und ich habe mich dran "gewöhnt" Jogibär
In dieser Zeile deines makefiles: $(CC) $(CFLAGS) -o $(NAME).out -Wl,-Map,$(NAME).map main.o sehe ich deine sorgfältig gesetzten LDFLAGS nicht LDFLAGS=-Wl,-Map=$(NAME).map,--cref,--section-start=.flashloader=$(START _ADR) --mmcu=$(MCU) bzw. sehe ich einen Teil davon explizit ausformuliert. Man könnte obige Zeile mal so probieren (kann's derzeit nicht testen): $(CC) $(CFLAGS) -o $(NAME).out $(LDFLAGS) main.o
Hallo, ich habe auch nie behauptet, "sorgfältig" gesetzte LDFLAGS zu benutzen ;-). Das Thema ist für mich neu, daher frage ich mal nach. Ich habe mal Deinen Vorschlag ausprobiert; ich bekomme wenigstens keine Fehlermeldung. Allerding sieht die Hexdatei nicht gerade erfolgsversprechend aus: :1000000012C02BC02AC029C028C027C026C025C0C6 :1000100024C023C022C021C020C01FC01EC01DC0DC :100020001CC01BC01AC011241FBECFE5D4E0DEBF28 :10003000CDBF10E0A0E6B0E0E2E7F0E002C005903E :100040000D92A036B107D9F710E0A0E6B0E001C0EC :100050001D92A036B107E1F701C0D2CFCFE5D4E0C1 :10006000DEBFCDBF8FEF84BB85BB80E090E000C0DA :02007000FFCFC0 :00000001FF In der ersten Zeile bin ich immer noch bei Adresse 0; Ich habe Deinen Vorschlag mal an diese Position eingesetzt: $(NAME).hex : $(NAME).out $(CC) $(CFLAGS) -o $(NAME).out $(LDFLAGS) main.o $(OBJCOPY) -R .eeprom -O ihex $(NAME).out $(NAME).hex Ist das überhaupt richtig ? Hoppla, ich schreibe einfach mal weiter Ich habe mal in den Optionen .flashloader durch .text ersetzt. Dadurch erhalte ich folgendes: :1018000012C02BC02AC029C028C027C026C025C0AE :1018100024C023C022C021C020C01FC01EC01DC0C4 :101820001CC01BC01AC011241FBECFE5D4E0DEBF10 :10183000CDBF10E0A0E6B0E0E2E7F8E102C005901D :101840000D92A036B107D9F710E0A0E6B0E001C0D4 :101850001D92A036B107E1F701C0D2CFCFE5D4E0A9 :10186000DEBFCDBF8FEF84BB85BB80E090E000C0C2 :02187000FFCFA8 :0400000300001800E1 :00000001FF Das sieht doch schon erheblich besser aus. Ist die Option flashloader für ein eventuell nachträglich aufgerufenes Flashprogramm ? Der normale Code ist doch nur text, oder ? Jogibär
> Ist die Option flashloader für ein eventuell nachträglich aufgerufenes > Flashprogramm ? Nee, für einen vorher aufgerufenen Bootloader. Das steht jedenfalls als Kommentar im makefile. Der Bootloader soll das Flash füllen und liegt selbst im Flash ab der angegebenen Adresse. Damit er arbeiten kann, muss die entsprechende Fuse gesetzt sein. Das HEX-File zu analysieren ist mutig. Ich würde das MAP-File anschauen bzw. mir ein Listing ausgeben lassen. > Der normale Code ist doch nur text, oder ? .text und .data. .data ist aber relativ zu .text angegeben. Näheres bei den Linkercontrolscripts in <winavr>\avr\lib\ldscripts dort avr4.x für die Atmega8 und normale Programme Bist du sicher mit dem Verlagern deines Programms an eine andere Startadresse? Was hast du mit dem Startupcode der C-Library und den Vektoren für die Interrupts geplant?
Hallo, danke für Deine Antwort. Das Programm soll in den Bootloader Bereich des ATMega. Mit den Interrupts habe ich keine Probleme, ich nutze diese nämlich nicht. Was Du mit dem Startupcode meinst, ist mir etwas unklar. Der wird ja vom GCC eingefügt und setz am Anfang Stack und ähnliches. Auf diesen habe ich doch vom C Programm gar keinen Einfluß. Das der natürlich auf die geänderte Startadresse angepaßt werden muß ist mir eigentlich klar. Bei Assembler hatte man dazu direkt den .org Befehl. Soweit ich dies gelesen habe, muß man bei C dem Linker die geänderte Startadresse mitteilen, und der kümmert sich dann um den Rest. Ich habe mal bei einem Bootloaderproggramm geschaut, da steht in den C Dateien auch nichts bezüglich der Startadresse. Dort wird es auch über den Linker erledigt. Jogibär
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.