Boot Loader für Atmega8 ???

Gast #364418
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);
}
Gast #364423
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
Moderator Persönliche Seite #364424
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ß.
Gast #364425
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...

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.