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