Forum: Mikrocontroller und Digitale Elektronik Nochmal ATMEGA128 Bootloader mit Megaload


von Robert H. (kee4)


Lesenswert?

Hallo zusammen,
es gibt zwar viele Beiträge - teilweise bis auf 2005 zurückgehend, aber 
leider finde ich in keien eine passende Lösung, deshalb eröffne ich hier 
nochmal einen neuen Thread.

Ich benötige auf einem ATMeaga128a den Megaloadbootloader um eine ältere 
Hardware zum Laufen zu bringen. Schaffe es aber leider nicht den Source 
zu übersetzten. Ich bekomme immer die Fehlermeldung:
  asmPart.S:38:13: error: attempt to use poisoned "SPMCR"

Aber jetzt der Reihe nach:
o Ich habe im AVR-Studio (V4.18) ein neues Projekt angelegt.
o AVR Toolchain: WinAVR "20100110"
o mit der Compilerversion 5.4.0 (*)
o Als Source habe ich den von Werner B. für avr-gcc angepassten Code vom 
26.06.06 genommen.
  Beitrag "Re: MegaLoad für avr-gcc"
o Die Dateien (asmPart.S, assembly.h, Main.c, Main.h, Makefile) habe ich 
alle ins   Root des Projects kopiert
o Die "Projekteinstellungen! sind:
  + Device atemga128
  + Source Files + Main.c
                 + asmPart.S
  + Header Files + assembly.h
                 + main.h
  + Use External Makefile [D:...\AVR\20221004_ATMBL\Makefile ] aus dem 
Projektverzeichnis
  + Anpassungen im Makefile:
    o MCU = atmega128
    o F_CPU  =  7372800
    o BOOTSTRT = 0x1FC00
    o FUSEHIGH = 0x84
    o FUSELOW  = 0x01
    o FUSEEXT  = 0xFF

* Eine Nebenfrage:
  Wo gehört die Optimierungsoption "-flto" hin?
  => CFLAGS += -flto
  => LDFLAGS += -flto

Zu meinem Problem (error: attempt to use poisoned "SPMCR") habe ich 
diesen Beitrag von Jörg gefunden:
  https://www.mail-archive.com/avr-libc-dev@nongnu.org/msg05424.html
Ich habe die boot.h so angepast:
  /* Check for SPM Control Register in processor. */
  #if defined (SPMCSR)
  #  define __SPM_REG    SPMCSR
  #else
  #  if defined (SPMCR)
  #    define __SPM_REG    SPMCR
  #  else
  #    if defined (SPMCR)
  #      define __SPM_REG    SPMCR
  #    else
  #      error AVR processor does not provide bootloader support!
  #    endif
  #  endif
  #endif
Aber das brachte auch keinen Erfolg!

Mit fehlt auch im Projekt der Zugriff auf die Boot.h!
Im ganzen Code finde ich kein "#include boot.h"

Kann mir jemand weiter helfen?
Danke schon mal.

Gruß Robert
-KEE4-

(*) zuvor hatte ich 4.3.3 und da wurde der Code zu groß und ich bekam 
die Fehlermeldung:
c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/bin/ld.exe: 
address 0x20142 of atmega128.elf section .text is not within region text
Ein Update auf den Compiler 5.4.0 brachte abhilfe.

von Stefan F. (Gast)


Lesenswert?

Megaloadbootloader: Der heisst Megadolon.

Spaß beiseite: Hinterfrage doch mal lieber, was der gcc mit "attempt to 
use poisoned" meint.

Offenbar versucht da jemand auf ein Register zuzugreifen, ohne die dazu 
nötige Header Datei (im betroffenen C-File) eingebunden zu haben.

> Wo gehört die Optimierungsoption "-flto" hin?
>  => CFLAGS += -flto
>  => LDFLAGS += -flto

In meinem Makefile wird das Flag sowohl beim Compilieren als auch beim 
Linken verwendet. Dafür habe ich eine eigene Variable namens FLAGS.

Leider habe ich keinen Zugriff auf D:...\AVR\20221004_ATMBL

Vielleicht hängst du mal das gesamte Projekt an, dann kann man deinen 
Fall besser nachvollziehen und Vorschläge ausprobieren, bevor man 
nutzlose Antworten schreibt.

von Robert H. (kee4)


Angehängte Dateien:

Lesenswert?

Hallo Stefan,
Danke für die schnelle Antwort.
> Vielleicht hängst du mal das gesamte Projekt an
Gerne! Ich habe mal das Projekt als ZIP angehängt.
In das Projekt habe ich die modifizierte aus 
"C:\WinAVR-20100110\avr\include\avr" boot.h als boot.h.modified auch 
rein.

> Hinterfrage doch mal lieber, was der gcc mit "attempt to use poisoned" meint
Das www sagt, es sich hier um eine alte Bezeichung handelt, die nicht
mehr verwendet werden soll. 
Beitrag "Re: Fehlermeldung bei ATmega48"

> Offenbar versucht da jemand auf ein Register zuzugreifen, ohne die dazu
> nötige Header Datei eingebunden zu haben.
Das ist mir aufgefallen, deswegen "ich kann nirgendwo '#include boot.h' 
finden.

In asmPart.S ist auch noch ein ganz komisches auskomentiertes Konstrukt:
/*
#if define(_AVR_ATmega64_) || defined (_AVR_ATmega128_)
    SPMCR = 0x68
#else
    SPMCR = 0x57
#endif
*/
Hier soll wohl versucht werde, das Register SPMCR abhängig vom Contoller
zu definieren. Aber ist der #if-Ausdruck sinnvoll?
define(_AVR_ATmega64_) => defined(_AVR_ATmega64_)

Ich habe in boot.h folgende MOdikikation vorgenommen
/* Check for SPM Control Register in processor. */
#if defined (SPMCSR)
#  define __SPM_REG    SPMCSR
#warning if defined (SPMCSR)
#else
#  if defined (SPMCR)
#    define __SPM_REG    SPMCR
#  else
#    error AVR processor does not provide bootloader support!
#  endif
#endif

Die Warnung wir beim Complieren angezeigt, wenn boot.h in asmPart.S
includiert (#include <avr/boot.h>) ist. Also musss (SPMCSR) iregendwo 
definiert werden.

Mir fehlt für das Ganze die Erfahrung.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Robert H. schrieb:
> /*
> #if define(AVR_ATmega64) || defined (AVR_ATmega128)
>     SPMCR = 0x68
> #else
>     SPMCR = 0x57
> #endif
> */

> ist der #if-Ausdruck sinnvoll?

Gute Frage. SPMCR ist beim ATmega128 wirklich an Adresse 0x68.

In er Datei include/avr/io.h kannst du sehen, ob die Bedingung stimmt. 
Im meiner steht "__AVR_ATmega128__" mit doppelten Unterstrichen!

Beitrag #7214536 wurde von einem Moderator gelöscht.
von Stefan F. (Gast)


Lesenswert?

Ich denke die einfachste Lösung ist, in der Datei asmPart.S alle "SPMCR" 
durch "SPMCSR" zu ersetzen.

In der Datei iom128.h welche von io.h includiert wird, ist das Register 
doppelt unter beiden Namen definiert:
1
/* Store Program Memory Control and Status Register */
2
#define SPMCR     _SFR_MEM8(0x68)
3
#define SPMCSR    _SFR_MEM8(0x68) /* new name in datasheet (2467E-AVR-05/02) */

Weiter unten in der selben Datei ist die Ursache für deine 
Fehlermeldung:
1
#pragma GCC poison SPMCR

von Robert H. (kee4)


Lesenswert?

Danke für den Tipps:
Ersetzten von "SPMCR" in "SPMCSR" machte den Code ohne Fehler 
übersetztbar!

Dazu gelernt habe ich auch was:
> Hinterfrage doch mal lieber, was der gcc mit "attempt to use poisoned" meint.
> Weiter unten in der selben Datei ist die Ursache für deine Fehlermeldung:
> #pragma GCC poison SPMCR

Das wusste ich noch nicht.

Danke - bin ein schönes Stück weiter gekommen.
Jetzt muß ich den BL wahrscheinlich ein wenig anpassen, dass die 
Applikation läuft. Irgendwie tut sich an den Ports die I2C und ein 
Display ansteuern nichts.
Wäre es üblich die Hardware für die Applikation im Booltloader und nicht 
erst in der Applikation einzustellen.
Also "DRR" usw ...

Robert

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Robert H. schrieb:
> Wäre es üblich die Hardware für die Applikation im Bootloader und nicht
> erst in der Applikation einzustellen.

Du meinst wie das BIOS und die ROMS der Steckkarten von einem alten DOS 
PC, welche fast die gesamte Hardware initialisieren?

Diese Vorgehensweise ist heute nicht mehr üblich, nicht einmal in PCs. 
Von einem Bootloader erwarte ich, dass er nur das für sich absolut 
notwendige macht und vor dem Programmstart möglichst viel wieder 
aufräumt. Für das Programm sollte demnach egal sein, ob es mit oder ohne 
Bootloader gestartet wurde.

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.