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


von David M. (md2k7)


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

von kosmonaut_pirx (Gast)


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

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


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'.

von David M. (md2k7)


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

von kosmonaut_pirx (Gast)


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

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


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.

von Christian (Gast)


Lesenswert?

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

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

aber ich arbeite nicht mit makefiles, sondern mit batch-dateien. da 
sieht das dann so aus:
1
@REM ---------------------------------------------------------------------------
2
@REM Sections festlegen
3
@set set_bt=--section-start=.bootloader=0x0F000
4
@set set_id=--section-start=.ident=0x0FFEB
5
6
@REM ---------------------------------------------------------------------------
7
@REM - Optionen
8
@set mcu=-mmcu=atmega64
9
@set incl=-I%INCLUDE_DIR%
10
@set comp=-g -Wall -c -o
11
@set link=-g -Wall -Wl,-Map,%MODNAME%.map,%set_id%,%set_bt%

hilft das weiter??

Gruß Christian

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.