avrgcc AtMega128 Bootloader Section

Gast #2602034
Lesenswert?

Hallo zusammen,
ich habe ein kleines Problem mit meinem Bootloader auf dem Mega128. Der 
Code funktioniert auf Mega32 und Mega64 einwandfrei, nur auf dem Mega128 
wills nicht hinhauen. Schreibe ich ihn direkt an den Anfang vom Flash 
tuts soweit (natürlich kann er sich nicht selbst überschreiben), wenn 
ich ihn dann in den Bootloader-Bereich schreibe funktioniert gar nichts 
:((

Ich habe dem avr-gcc linker mit --section-start=.text=1E000 gesagt, der 
soll den Code bei der Bootloader-Section schreiben (4096 Word 
Bootloader, erstmal so zum testen).
Allerdings scheint in der HEX-Datei der Code nicht auf der richtigen 
Adresse zu landen:

:020000021000EC
:10E000000C9452F00C9471F00C9471F00C9471F02B
:10E010000C9471F00C9471F00C9471F00C9471F0FC
:10E020000C9471F00C9471F00C9471F00C9471F0EC
:10E030000C9471F00C9471F00C9471F00C9471F0DC
:10E040000C9471F00C9471F00C9471F00C9471F0CC
:10E050000C9471F00C9471F00C9471F00C9471F0BC...

Wenn ich das richtig deute startet das bei Adresse E0000 (also noch in 
den unteren 64kB ??) .. nanu??

Weis da jemand eine Lösung zu?

Hier scheint ein ähnliches Problem vorliegen: 
Beitrag "WinAvr 2010 Bootloader Atmega128 Problem"
Allerdings werd ich da nicht wirklich schlau raus, wo soll ich da denn 
was umstellen?
Ich benutze Eclipse mit WinAvr2010, die Fuses BOOTSZ0, BOOTSZ1 und 
BOOTRST sind gesetzt.

Schöne Grüße aus Aachen

Marco
Gast #2602081
Lesenswert?

Jup, hast recht, daran liegt es also nicht:
1
avr-objdump -h CAN-Bootloader-Life.hex
2

3
CAN-Bootloader-Life.hex:     file format ihex
4

5
Sections:
6
Idx Name          Size      VMA       LMA       File off  Algn
7
  0 .sec1         00000808  0001e000  0001e000  00000011  2**0
8
                  CONTENTS, ALLOC, LOAD

Damit komme ich aber dann auch nicht weiter. Der Code wird zwar 
irgentwie begonnen, aber das ganze CAN-System funktioniert einfach 
nicht. Wie gesagt, wenn ich das Offset raus nehme klappt alles. Da bin 
ich mit meinem Latein am Ende...

Marco
Gast #2602138
Lesenswert?

Hallo Stefan,

ja M103 ist definitiv deaktiviert, keine Interruptroutinen. Um die 
Verwirrung komplett zu machen, hier das Resultat eines kleinen 
Experiments:
Ich hab die Hex vom Bootloader hinter die Hex vom Nutzerprogramm kopiert 
(den ersten End-Of-Record Eintrag entsprechend gelöscht) und dann 
geflashed.
Die Boot-LED war ganz brav eine halbe Sekunde lang an, dann ist das 
Nutzerprogramm gestartet worden. Allerdings ist keine CAN-Nachricht 
gekommen - und das obwohl das Programm folgendermaßen aussieht:
1
int main(void){
2
  set_bootled_ddr;
3
  // CAN-Adapter initialisieren
4
  while(!can_init(BITRATE_1_MBPS)){
5

6
  }
7
  // Timer starten
8
  TCNT1 = TIMER_PRELOAD;
9
  TCCR1A = 0;
10
  TCCR1B = TIMER_PRESCALER;
11
  TIMER_INTERRUPT_FLAG_REGISTER = (1 << TOV1);
12
  //### Test-Nachricht versenden ###
13
  msg.flags.rtr = 0;
14
  msg.id = 111;
15
  msg.length = 0;
16
  while(can_send_message(&msg)==0){
17

18
  }
19
  led_on;

Es wird also so lange in der Schleife gewartet, bis der Adapter 
initialisiert wurde und die Nachricht (angeblich) erfolgreich verschickt 
wird. Erst DANACH geht die LED an. Tja, die Nachricht kommt halt 
trotzdem nie.
Das Nutzerprogramm benutzt die gleich CAN-Lib (die von Creatives-Chaos) 
und da funktionierts einwandfrei. Und wenn ich nun nur den Bootloader 
ohne den Adress-Offset kompiliere und flashe dann wird auch die 
Nachricht ordnungsgemäß abgeschickt.

Nun bin ich absolut ratlos...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren