AVR Studio 6 und Bootloader

Gast #4054831
Lesenswert?

Hallo,

ich weiss, dass das Problem schon mal in Forum angesprochen wurde, 
jedoch gab es nie eine Eindeutige Lösung, nach welcher man sich richten 
kann.

Ich benutze AVR Studio 6 und möchte ein CAN Bootloader von 
kreatives-chaos.de einspielen.
Das Problem ist, wo und wie gebe ich an, wo das Programm anfängt? Nach 
langer Suche, habe ich einige Lösungsansätze gefunden, aber diese haben 
mir nicht geholfen. Der Bootloader taucht immer noch am Anfang der HEX 
Datei auf.

Anbei mein Lösungsanstaz. Was mache ich falsch?

Gruss Stefan
Angehängte Dateien:
Gast #4055925
Lesenswert?

Hallo Sebastian,

danke dir! Ich bin für jede Hilfe dankbar.

Ich bin auch etwas weiter, nun wird der Bootloader programmiert, sitzt 
aber an der falschen Stelle! Siehe meine Datei!

Ich glaube mein Problem liegt, die ganze Zeit. An der Byte bzw. Wort 
Adressierung.

Laut Datenblatt geht bei AT90CAN128 der Bootloader ab 0x1E000 (Byte 
adressing).
Was ist die richtige Wort adresse in diesem Fall? 0xE000 ist sicherlich 
faslch?

Gruss Stefan
Angehängte Dateien:
#4056099
Lesenswert?

Stefan schrieb:
> Hallo Sebastian,
>
> danke dir! Ich bin für jede Hilfe dankbar.
>
> Ich bin auch etwas weiter, nun wird der Bootloader programmiert, sitzt
> aber an der falschen Stelle! Siehe meine Datei!
>
> Ich glaube mein Problem liegt, die ganze Zeit. An der Byte bzw. Wort
> Adressierung.
>
> Laut Datenblatt geht bei AT90CAN128 der Bootloader ab 0x1E000 (Byte
> adressing).
> Was ist die richtige Wort adresse in diesem Fall? 0xE000 ist sicherlich
> faslch?
>
> Gruss Stefan

0x1E000 als Byte-Adresse entspricht 0xF000 als Wort-Adresse (0x1E000/2 = 
0xF000).

Aber in deiner hex-Datei hängt die IRQ-Sprungtabelle direkt vor dem 
Bootloader rum. Das ist so auch noch nicht gut.

LG, Sebastian
#4056210
Lesenswert?

Ok, ich hab hier einen Ethernet-Bootloader für einen Atmega1284P 
zusammen mit einem W5500 in Atmel Studio 6 (6.1.2730 SP 2).

Folgende Einstellungen waren wichtig:

C Compiler -> Miscellaneous: -fno-jump-tables
Linker -> Libraries: <empty>
Linker -> Memory Settings -> FLASH segment: .text=0xF000
Linker -> Miscellaneous: -nostartfiles

Im Quellcode bin ich folgendermassen vorgegangen:
1
void init (void) __attribute__ ((naked)) __attribute__ ((section (".vectors")));
2
void init (void) {asm volatile ( "rjmp start" );}
3

4
void __do_copy_data (void) __attribute__ ((naked)) __attribute__ ((section (".text9")));
5
void __do_copy_data (void) {}
6
void __do_clear_bss (void) __attribute__ ((naked)) __attribute__ ((section (".text9")));
7
void __do_clear_bss (void) {}
8

9
<Hier eventuell einige Funktionen, damit die Sprungadressen klein bleiben>
10
 
11
// PROGMEM ist OK, aber NUR mit folgender Funktion:
12
// All our PROGMEM data is in the same extended range as the FLASHEND
13
#define pgm_read_byte_progmem(ptr) pgm_read_byte_far((FLASHEND&0xFFFF0000)|(uint16_t)(ptr))
14

15
void start (void) __attribute__ ((naked)) __attribute__ ((section (".init0")));
16
void start (void) {
17
    asm volatile ( "ldi  16, %0" :: "i" (RAMEND >> 8) );
18
    asm volatile ( "out %0,16" :: "i" (AVR_STACK_POINTER_HI_ADDR) );
19
    asm volatile ( "ldi  16, %0" :: "i" (RAMEND & 0x0ff) );
20
    asm volatile ( "out %0,16" :: "i" (AVR_STACK_POINTER_LO_ADDR) );
21
    asm volatile ( "clr __zero_reg__" );                  // GCC depends on register r1 set to 0
22
    asm volatile ( "out %0, __zero_reg__" :: "I" (_SFR_IO_ADDR(SREG)) );  // set SREG to 0
23
  
24
    // Ab hier normal weiter. Aber Achtung! Keine vorinitialisierten globalen SRAM Variablen!
25
    mcusr = MCUSR;
26
    MCUSR = 0;
27
    wdt_reset();
28
    wdt_disable();
29

30
    ...

Anbei mal meine .map-Datei.

Ach ja, und die Fuses auf Boot reset vector enabled, boot section size 
4096 words start address $F000 words (0x1E000 bytes).

Viel Erfolg!

LG, Sebastian
Angehängte Dateien:

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