www.mikrocontroller.net

Forum: Compiler & IDEs Linker - Assembler Source in Bootloader Section legen?


Autor: David Madl (md2k7)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi @ all,

ich bin mit meinen GCC Kenntnissen als Umsteiger vom "PC-GCC" bei 
avr-gcc schon wieder am Ende.
Ich möchte meinen in Assembler geschriebenen Bootloader vom Linker in 
die Bootloader-Section legen lassen. Folgende Makefile-Option habe ich 
gefunden:

LDFLAGS += -Wl,--section-start=.text=$(MT_BOOTLOADER_ADDRESS)

Sagt dem Linker, dass der gesamte Code ab MT_BOOTLOADER_ADDRESS, darüber 
definiert, abgelegt werden soll. Soweit, so gut.
Nun möchte ich aber meinen "normalen" C-Code ganz normal ab Adresse 0, 
den Bootloader in Assembler aber in die Bootloader-Section legen.
Dazu habe ich mir in der .S-Datei eine neue Section gezimmert:

.section bootloader
  ; ...

und im Makefile in oben genannter Zeile .text auf bootloader geändert. 
Ergebnis: Der C-Code kommt wie gewohnt an Adresse 0, was ich in die 
bootloader Section geschrieben habe, fehlt!
Testweise habe ich bootloader in .bootloader umbenannt, wonach in der 
Memory Usage zwar die zusätzlichen Bytes aufscheinen, aber in der hex 
Datei fehlt der Bootloader noch immer.

Wie kann man nun dem Linker sagen, dass er diese Section gefälligst auch 
in den Flash legen soll?

Cu
David

Autor: kosmonaut_pirx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
der linker legt .text und unbekannte sectionen immer in den flash, das 
ist fakt.
dein vorgehen scheint in ordnung zu sein. gib doch bitte einmal ein 
lauffähiges beispiel, oder besser zunächst die aufrufe des linkers samt 
dessen meldungen und read-elf output hier an. das hilft vielleicht schon 
weiter.
bye kosmo

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es hat keinen rechten Sinn, Bootloader und Applikation zwanghaft in
einem Projekt zu ,,verheiraten''.  Letztlich soll der Bootloader
klein, fein, stabil und unabhängig sein, und wenn der einmal debuggt
ist, braucht man sich nur noch um die Applikation zu kümmern.

Für den Bootloader verschiebt man dann einfach .text auf die
Bootloader-Adresse, und fertisch is'.

Autor: David Madl (md2k7)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jörg:
Es soll dann ein Hausbus werden, und ich wollte mir einfach nur den 
Aufwand ersparen, die Dinger doppelt zu programmieren. Also zuerst per 
ISP und dann noch per Bootloader die Applikation rein. Aber wenn ichs 
nicht anders hinkriege, bleibts wohl dabei.

Cu
David

Autor: kosmonaut_pirx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

@jörg: prinzipiell gebe ich dir ja recht. aber es macht dann sinn, wenn 
die BLS mal wieder nicht ausreicht. oder man sich den ganzen kram da 
oben sparen möchte. in dem sinne ist die BLS nur ein gesonderter 
bereich, der eben das schreiben in den flash erlaubt. dass das nun mal 
"boot loader section" heißt, ist möglicherweise nicht ganz glücklich 
gewählt. "flash write section" wäre vielleicht passender.dann sollte man 
die routinen für da oben selbstverfreilich nicht als "bootloader" 
beschreiben, sondern als das, wofür sie da sind. und zwar nicht zum 
booten.

bye kosmo

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
David Madl wrote:

> Es soll dann ein Hausbus werden, und ich wollte mir einfach nur den
> Aufwand ersparen, die Dinger doppelt zu programmieren. Also zuerst per
> ISP und dann noch per Bootloader die Applikation rein.

Gemeinsam programmieren bedeutet doch nicht zwanghaft, dass du sie
auch beide in einem ELF-File haben musst.  Erstens kannst du mit
einem avrdude-Aufruf auch zwei Hexdateien programmieren, zweitens
kannst du zwei Hexdateien einfach zusammenknoten, entweder mit der
Hand (du musst nur den Enderecord der ersten Datei löschen mit einem
Editor) oder mit den srecord-Tools.

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also ich mache es immer so, dass die c-Funktionen bei ein attribut 
bekommen:

z.b.:
WORD read_flash (void) __attribute__ ((section (".bootloader")));

aber ich arbeite nicht mit makefiles, sondern mit batch-dateien. da 
sieht das dann so aus:
@REM ---------------------------------------------------------------------------
@REM Sections festlegen
@set set_bt=--section-start=.bootloader=0x0F000
@set set_id=--section-start=.ident=0x0FFEB

@REM ---------------------------------------------------------------------------
@REM - Optionen
@set mcu=-mmcu=atmega64
@set incl=-I%INCLUDE_DIR%
@set comp=-g -Wall -c -o
@set link=-g -Wall -Wl,-Map,%MODNAME%.map,%set_id%,%set_bt%

hilft das weiter??

Gruß Christian

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.