Forum: Mikrocontroller und Digitale Elektronik avrgcc AtMega128 Bootloader Section


von marco (Gast)


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

von Krapao (Gast)


Lesenswert?

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

Nö, deutest du falsch.
Beitrag "Re: Peter Danneggers Bootloader (fastboot) für AVR-GCC-Toolchain"

von marco (Gast)


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

von Stefan E. (sternst)


Lesenswert?

marco schrieb:
> 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).

Und wie soll die Adresse 1E000 zu "4096 Word Bootloader" passen?

von marco (Gast)


Lesenswert?

Datenblatt Table 112: Boot Reset Address (start Boot Loader Section): 
$F000

Die Adressen sind alle in Words angeben, mal zwei macht das also 
0x1E000. Das Offset scheint zu passen.

von Stefan E. (sternst)


Lesenswert?

Ups, äußerst peinlicher Denkfehler meinerseits (0x10000 = 16k, wie 
konnte das denn passieren). ;-)

M103C wirklich deaktiviert?
Werden Interrupts verwendet?

von marco (Gast)


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

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.