Forum: Compiler & IDEs Boot Loader für Atmega8 ???


von Jürgen K. (Gast)


Lesenswert?

Kann mir bitte jemand erklären, warum das unten stehende Programm nicht
funktioniert? Das Programm ist für einen M8 und ich benutze die neuste
Version von WinAVR. Ich will mir einen Boot Loader für den M8 schreiben
und habe dazu dieses kleine Testprogramm verfasst. Das Programm wird an
die Adresse 0x0c00 gelinkt und funktioniert auch soweit (Toggle Bit am
Programmende für einen Frequenzmesser und .lss-Datei überprüft). Wenn
ich das Flash mit PonyProg auslese nachdem das Programm gestartet
wurde, stehen an Adresse 0x0100 nur FF's. Ich habe mal manuell einige
Werte ab Adresse 0x0100 eingegeben, mit PonyProg ins Flash
zurückgeschrieben, dass Programm gestartet und danach das Flash wieder
ausgelesen. Es standen immer noch die Werte ab der Adresse 0x0100 die
ich zuvor dort manuell eingegeben habe. D.h. die Löschfunktion
boot_page_erase( address ); wird schon nicht ausgeführt!

Gruß Jürgen



#include <avr/io.h>
#include <avr/boot.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>

unsigned char buffer[64];

int main(void)
{
unsigned char c, *p;
unsigned int i;
unsigned long address = 0x100L;

  p = buffer;

  for(c=0;c<64;c++)
    *p++ = c;
  cli();
  eeprom_busy_wait();

  boot_page_erase( address );
  boot_spm_busy_wait();

  for( c=0, p=buffer; c<SPM_PAGESIZE; c+=2 )
  {
    i = (unsigned int)*p++;
    i += (unsigned int)(*p++ << 8);
    boot_page_fill( address+c, i );
  }

  boot_page_write( address );
  boot_spm_busy_wait();

  DDRB |= PB2;
  for(;;)
  {
    PORTB |= PB2;
    PORTB &= (~(PB2));
  }

  return(0);
}

von Dirk B. (dirk-)


Lesenswert?

p = buffer;

sollte das nicht so sein p= &buffer; ?


Gruß,

Dirk

von Werner B. (Gast)


Lesenswert?

@Dirk

NEIN, der Name eines Arrays IST die Adresse.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Das Programm wird an
> die Adresse 0x0c00 gelinkt.

Die boot loader section beginnt aber frühestens bei 2 * 0xc00
(= 0x1800).  Das Datenblatt nennt Wortadressen, die GNU
Toolchain arbeitet mit Byteadressen.

von Jürgen K. (Gast)


Lesenswert?

Ja, stimmt! Danke @Jörg, die Linkadresse mus 0x1800 sein!
Gruß Jürgen

von Nik Bamert (Gast)


Lesenswert?

Ich frage gleich kurz hier, dafür einen neuen Thread zu erstellen wäre
einfach nicht sinnvoll; daher:

Heisst das "1024words" im Datenblatt für den mega8 nun, dass ich
maximal
2048 bytes in die Bootsection quetschen kann?
Angenommen GCC sagt mir section .text 1838, passt das dann noch, oder
wie kann ich das verstehen?

Nik

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Heisst das "1024words" im Datenblatt für den mega8 nun, dass ich
> maximal 2048 bytes in die Bootsection quetschen kann?

Ja, die AVR-Datenblätter bezeichnen die Codegrößen immer in
16-bit-Worten.

> Angenommen GCC sagt mir section .text 1838, passt das dann noch,
> oder wie kann ich das verstehen?

Da ist noch reichlich Platz (allerding musst du noch .data addieren,
das braucht auch ROM -- für die Initialwerte).  Die GNU-Tools nehmen
immer Bytes als Maß, sie laufen nämlich auf Maschinen mit Wortbreiten
von 8, 16, 32 oder 64 bits, da wäre sonst die Verwirrung unendlich
groß.

von Nik Bamert (Gast)


Lesenswert?

Ahhaa, danke für die Aufklärung :-)

Ich finds zwar ein bisschen witzlos, da ich dann den UDP stack im
bootloader wie auch im eigentlich Programm hätte, aber theoretisch
hätte das ganze platz, ein Netzwerk Bootloader für den AVR...

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.