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.
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.
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
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.
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
|
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.