Forum: Mikrocontroller und Digitale Elektronik ATXMEGA128A1 Bootloader in Bootloader section flashen


von Jsc J. (alderaan)


Lesenswert?

Hallo,

ich habe einen Bootloader für den ATXMEGA128A1 geschrieben und möchte 
das Programm nun in die Bootloader-Section per AVR Studio flashen. Wenn 
ich kompiliere entstehen die sections .BOOT und .text. In den Memory 
Settings des Projekts steht der Memory Type Flash mit der section .BOOT 
und der Startadresse 0x10000 (Word). An diese Adresse in Flash wird aber 
nur eine Routine (SP_LoadFlashPage) geflasht:
.BOOT          0x00020000      0x3a
.BOOT          0x00020000      0x3a sp_driver.o
               0x00020000      SP_LoadFlashPage

Meine restlichen Funktionen (serieller Empfang der Daten etc.) werden in 
die section .text geflasht, welche bei 0x00000 beginnt-also in der 
application-section.
Wenn ich nun:
LDFLAGS += -Wl,-section-start=.text=0x20000
in den Linker Options einfüge gibt es vom .text segment eine Memory 
Überlappung mit dem .BOOT Segment, welches ebenfalls bei 0x20000 
beginnt.

Bin einigermassen verwirrt bzgl. der Memory Settings, wie kann ich der 
Kiste beibringen, ALLE Funktionen meines Bootloader Programms in den 
Flash Bereich ab 0x20000 zu flashen?

von xmega (Gast)


Lesenswert?

hi,

bei meinem ATxmega128a3 habe ich es wie folgt gemacht 
(Projekt-Eigenschaften, Memories (AVR Studio)):

"Flash .text 0x10000" (word)
"Flash .BOOT 0x10F00" (word)

d.h. text section steht zu beginn des bootflashs und BOOT section am 
Ende.

Man muss sich hier nur bewusst über die Größen der jeweiligen Sections 
sein. Die Größen kannst du auch in der .lss-Datei nachsehen.
Es ist eine unschöne statische Lösung, die funktioniert :)

von Jsc J. (alderaan)


Angehängte Dateien:

Lesenswert?

Hi,

danke. Ich habe mit Deiner Lösung das Programm fehlerfrei kompilieren 
können. Leider schmiert AVR Studio bei "reading flash input" 
reproduzierbar ab, wenn ich es zu flashen versuche.

Der Linker macht folgendes:
avr-gcc -mmcu=atxmega128a1 -Wl,-Map=Boot10CH_LED.map 
-Wl,-section-start=.text=0x20000 -Wl,-section-start=.BOOT=0x21e00 main.o 
usart_driver.o Memory01.o eeprom.o eeprom_driver.o write_flash.o 
sp_driver.o     -o Boot10CH_LED.elf

.lss und .map sind im Anhang-vielleicht siehst Du was darin...

von xmega (Gast)


Lesenswert?

hi,

.lss sieht ok aus.

Ich würd mir erstmal ein neues Projekt anlegen, das lediglich in einer 
endlosschleife z.b. eine led an und ausschaltet.
Das würde ich dann erstmal normal in appl-flash schreiben und zur 
kontrolle flash auslesen.
Dann veränder die .text section zum boot bereich, setzte die bootrst 
fuse und versuch es erneut. (keinen linker explizit verändern, nur .text 
section angeben)
Lies den Flash aus und dein Programm sollte nun im Boot Flash sein.

Wenn du soweit bist, kannst du ja dann die self programming header 
(sp_driver.h und sp_driver.S) hinzufügen und die .BOOT section anpassen.

Er sollte nun kompilieren.

Wenn das klappt kannst du nun deinen bootloader schreiben.
Bei Verwendung von Intterrupts, vergiss nicht die Interrupts vom Appl 
Flash zum BootFlash entsprechend anzupassen (IVSEL bit im PMIC). Bei 
einem Jmp muss dieses jedesmal auch geschehen.

von Jsc J. (alderaan)


Lesenswert?

Hi,

danke für die Strategie. Bin Deinem Rat gefolgt und habe ein Mini 
Programm geschrieben. Es ist ja nicht wirklich kompliziert aber ich 
will's noch mal sicherstellen:

1) Mini programm in Appl. section läuft, Portpin wackelt

2) In Memory Settings Memory Tpe "Flash" mit Name ".text" und Address 
"0x10000" definiert -> und kompiliert / gelinkt

3) In ARV Studio unter Fuses "Boot Loader Reset" (Fusebyte2 = 0xBF) 
ausgewählt und geflasht

Das lässt sich flashen ohne dass AVR Studio abstürzt aber mein Mini 
Programm läuft nicht mehr, Portpin wackelt nicht.

Muss ich noch etwas weiteres umstellen?

von xmega (Gast)


Lesenswert?

wenn du keine Interrupts nutzt, wars das..

lies den Flash mal aus und vergleich die hex-files....

von Jsc J. (alderaan)


Angehängte Dateien:

Lesenswert?

Hi,

bin gerade aus dem Urlaub zurück. Interrupts benutze ich in dem kleinen 
Testprogramm nicht. Habe die Software einmal in die Application section 
und dann in die Bootloader section geflasht. In der Application section 
zappelt der pin, aus der Bootloader section bekomme ich es schlicht und 
einfach nicht zum Laufen-irgendetwas grundlegendes mache ich noch 
falsch. AVR Einstellung?

Ich habe Dir das Mini Projekt als Zip file angehängt-wäre nett wenn Da 
mal drüberschaust.
1.hex = ausgelesen wenn in bootloader section geflasht
2.hex = ausgelesen wenn in application section geflasht

Danke für die unermütliche Unterstützung...

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.