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
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
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 :(
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
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
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
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)?
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