Forum: Compiler & IDEs selfloader in assembler in bootloader bereich platzieren


von Billy _. (slowflyer)


Lesenswert?

Hallo,

ich habe vor einer Zeit einen Selfloader in Assembler im AVR-Studio 
geschrieben (selfloader.asm), den ich jetzt in "WinAVR-Assembler" 
portiert habe (selfloader.s). Diesen Selfloader habe ich nun zu meinem 
C-Projekt (WinAVR mit AVR-Studio) unter den Source Files hinzugefügt. 
Mein Problem besteht nun darin, den Selfloader an einer bestimmeten 
Adresse im Bootloader-Bereich zu platzieren (konkret 0x1e00 beim 
Mega88).

Mir ist sicher klar, dass es hier schon den einen oder anderen ähnlichen 
Post dazu gab (die ich auch gelesen habe), jedoch will es nicht in 
meinen Schädel, wie das mit den sections funktioniert (oder gibts es gar 
andere Möglichkeiten?). Wo muss ich was angeben, damit eine 
Assemblerfile an eine bestimmte Stelle verschoben wird?

Gruß, Willi

von Billy _. (slowflyer)


Lesenswert?

Nach einem (fast) halben Tag habe ich es nun geschafft. Dabei habe ich 
das Makefile (das vom AVR-Studio) von Hand geändert:

von
LDFLAGS +=  -Wl,-Map=testproject.map

in
LDFLAGS +=  -Wl,--section-start=.bootloader=0x1e00,-Map=testproject.map

Ich habe vorher in project/configuration options/custom options alle 
möglichen Varianten ausprobiert und keinen Erfolg damit gehabt (entweder 
Fehlermeldungen oder der Selfloader an der falschen Stelle). Jetzt 
taucht der Selfloader auch an der richtigen Stelle im Hex-File auf.

Gruß, Willi

von Billy _. (slowflyer)


Lesenswert?

Argh!!!

Zu früh gefreut. Habe aus Versehen mein zusammengebasteltes Hex-File 
angeschaut. Problem besteht nach wie vor. Die Freude war nur von kurzer 
Dauer :(

von Joe D. (kosmonaut_pirx)


Lesenswert?

hallo,
wenn ich mir mal

http://www.nongnu.org/avr-libc/user-manual/assembler.html

so ansehe .. da steht was von

.section .text

so aufs geratewohl drauf los geraten .. das einfach auf

.section .bootloader

ändern, deine linker-anweisung von da oben beibehalten, und gut könnte 
sein.
nur als idee, habe kein asm-file parat.
bye kosmo



von Billy _. (slowflyer)


Lesenswert?

Ich habe mich wohl nicht vernünftig erklärt, also versuch ich es 
nochmal:

in selfloader.S steht am Anfang:

.section .bootloader

Dem Linker geb ich noch Folgendes mit:
-W1,--section-start=.bootloader=0x1E00

beim Kompilieren kommt Folgendes raus:

avr-gcc.exe  -mmcu=atmega88 -Wall -gdwarf-2 -DF_CPU=14745600UL -Os 
-fsigned-char  -MD -MP -MT adc.o -MF dep/adc.o.d  -c  ../adc.c
avr-gcc.exe  -mmcu=atmega88 -Wall -gdwarf-2 -DF_CPU=14745600UL -Os 
-fsigned-char  -MD -MP -MT main.o -MF dep/main.o.d  -c  ../main.c
avr-gcc.exe  -mmcu=atmega88 -Wall -gdwarf-2 -DF_CPU=14745600UL -Os 
-fsigned-char  -MD -MP -MT uart.o -MF dep/uart.o.d  -c  ../uart.c
avr-gcc.exe  -mmcu=atmega88 -x assembler-with-cpp -Wa,-gdwarf2 -c 
../selfloader.S
avr-gcc.exe -mmcu=atmega88 -W1,--section-start=.bootloader=0x1E00 
-Wl,-Map=test.map adc.o main.o uart.o selfloader.o     -o test.elf
avr-objcopy -O ihex -R .eeprom  test.elf test.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" 
--change-section-lma .eeprom=0 -O ihex test.elf test.eep
avr-objdump -h -S test.elf > test.lss

und nun am Ende der einzige Eintrag mit bootloader im Map-File:
OUTPUT(test.elf elf32-avr)

.bootloader     0x000013a2      0x128
 .bootloader    0x000013a2      0x128 selfloader.o

Wie man sieht sollte er bei 0x1e00 beginnen und nicht bei 0x13a2

Die vor- und letzte Zeile im Hex-File:
:0213A200000F3A
:00000001FF

Die Frage ist: wo ist der Bootloader gelandet?

Langsam ist zum Haare raufen


von Peter D. (peda)


Lesenswert?

Warum willst Du unbedingt die Anwendung und den Bootloader zusammen 
manschen ?

Schreib ihn als separates Programm.

Ich denke mal, der GCC-Assembler sollte auch .ORG verstehen, d.h. 
einfach den  Bootloader absolut plazieren und gut is.


Peter

von Billy _. (slowflyer)


Lesenswert?

Peter Dannegger wrote:
> Warum willst Du unbedingt die Anwendung und den Bootloader zusammen
> manschen ?

Der Selfloader funktioniert soweit (getestet) und der Sprung aus der 
Applikation erfolgt auch an die richtige Adresse(die des Selfloaders). 
Lade ich zuerst den Selfloader und flashe mit ihm den 
Applikationsbereich, so schmiert der µC nach einem erneuten Versuch den 
Selfloader anzuspringen ab. Nun dachte ich mir ich könnte das mal 
Debuggen um zu sehen was da passiert. Dafür müsste ich die beiden 
Programmteile zusammenbringen, damit ich es mit dem AVR-Studio und nem 
MKII debuggen kann.

> Ich denke mal, der GCC-Assembler sollte auch .ORG verstehen, d.h.
> einfach den  Bootloader absolut plazieren und gut is.

Die Org-Anweisung versteht er auch, jedoch kommt dann (beim 
"zusammengemantschtem" Code) folgende Fehlermeldung:

C:\Programme\WinAVR\bin\..\lib\gcc\avr\3.4.5\..\..\..\..\avr\bin\ld.exe: 
region text is full (test.elf section .text)

Oder bin ich total auf dem Holzweg? Gibt es vielleicht andere 
Lösungsansätze, wie man die Software debuggen könnte (Applikation und 
Selfloader zusammen)?

von Billy _. (slowflyer)


Lesenswert?

Haha (Triumph) !!!

Ich habe es endlich geschafft. Folgendes ist zu tun, wenn man beide 
Teile zusammenbringen möchte:

Eine ganz normales .S File im C-Projekt mit dem Bootloader/Selfloader 
erstellen und an den Anfang .section .bootloader, "ax" setzen.

Dann im AVR-Studio:

unter project/configuration options/memory settings ein neues 
Memory-Segment anlegen (Flash, Name ".bootlaoder", Adress = 0x0f00 (Word 
nicht Byte Adresse wo der Bootloader hinsoll)).

Beim kompilieren schiebt der Linker den Selfloader an die richtige 
Adresse.

Ich hoffe ich habe nichts vergessen (war vielleicht eine schwere 
Geburt). Muss ich natürlich noch testen (im Hex- und lss-file tauchr er 
auf jeden Fall an der richtigen Adresse auf), das mach ich heute aber 
nicht mehr.

Gruß, Slowflyer

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.