mikrocontroller.net

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


Autor: Jürgen K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);
}

Autor: Dirk Bxxxxx (dirk-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
p = buffer;

sollte das nicht so sein p= &buffer; ?


Gruß,

Dirk

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Dirk

NEIN, der Name eines Arrays IST die Adresse.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jürgen K. (Gast)
Datum:

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

Autor: Nik Bamert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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ß.

Autor: Nik Bamert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.