mikrocontroller.net

Forum: Compiler & IDEs Makefile um Linkeraufruf erweitern


Autor: Michael J. (jogibaer)
Datum:
Angehängte Dateien:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

Autor: Michael J. (jogibaer)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

Autor: Michael J. (jogibaer)
Datum:

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

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.