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