Forum: Compiler & IDEs ATmega128 Bootloader Problem


von DerMax (Gast)


Lesenswert?

Hallo,
ich schreibe gerade an einem Bootloader für einen mega128. Ich verwende
den aktuellen avr-gcc (avr-libc 1.4.3). Leider hab ich ein kleines
Problem:
Wenn ich eine Page mit boot_page_write(addr) schreibe und addr = 0 ist
landet diese nicht am Anfang des Speichers sondern genau bei 64k. Mit
boot_page_erase(addr) verhält es sich genauso.
Laut mega128 Datenblatt wählt man den gewünschten Speicherbereich mit
Hilfe des RAMPZ-Registers. Aber das sollte doch eigentlich der avr-gcc
alles von alleine machen, nich umsonst übergibt man ja den Funktionen
als Adresse einen 32-Bit Wert. Was mache ich also falsch?

mfg
DerMax

von DerMax (Gast)


Lesenswert?

ähhh ich bin ja der letzte der irgendwo schreit ah da is nen Bug im
Compiler und nich in meinem Code, aber ich hab gerade mal den alten
avr-gcc (avr-libc 1.2.3) ausprobiert und der tut so wie er soll...

von Εrnst B. (ernst)


Lesenswert?

Der Bootloader-support ist ja rein in den boot.h header files, hast Du
die mal verglichen zw. den Versionen?

/Ernst

von Magnus Müller (Gast)


Lesenswert?

@DerMax:

Ich hatte letztens (fast) das selbe Problem.

Mikrocontroller :          ATmega128
Compiler :                 WinAVR 20060125

Ich wollte die boot.h ausprobieren, indem ich den Speicherbereich von
0x2000 bis 0xEFFF (Wort-Adresse) vom Bootloader (0xF000) aus
beschreiben liess. Dabei stellte sich heraus, dass der Bootloader nur
von 0x2000 bis 0x7FFF schrieb und dann bei 0x0000 weiter machte.

Erst hatte ich mein Programm verdächtigt... aber nach längerem Suchen
kam ich darauf, dass der Fehler wohl in WinAVR liegen muss.

Ein kurzer(?) Auszug aus "boot.h":

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* Normal versions of the macros use 16-bit addresses.
   Extended versions of the macros use 32-bit addresses.
   Alternate versions of the macros use 16-bit addresses and require
special
   instruction sequences after LPM.

   FLASHEND is defined in the ioXXXX.h file.
   USHRT_MAX is defined in <limits.h>. */

#if defined(_AVR_ATmega161_) || defined(_AVR_ATmega163_) \
    || defined(_AVR_ATmega323_)

/* Alternate: ATmega161/163/323 and 16 bit address */
#define boot_page_fill(address, data)
__boot_page_fill_alternate(address, data)
#define boot_page_erase(address)
__boot_page_erase_alternate(address)
#define boot_page_write(address)
__boot_page_write_alternate(address)
#define boot_rww_enable()             __boot_rww_enable_alternate()
#define boot_lock_bits_set(lock_bits)
__boot_lock_bits_set_alternate(lock_bits)

#elif ((FLASHEND > USHRT_MAX) && (__USING_MINT8))

/* Extended: >16 bit address */
#define boot_page_fill(address, data)
__boot_page_fill_extended(address, data)
#define boot_page_erase(address)
__boot_page_erase_extended(address)
#define boot_page_write(address)
__boot_page_write_extended(address)
#define boot_rww_enable()             __boot_rww_enable()
#define boot_lock_bits_set(lock_bits) __boot_lock_bits_set(lock_bits)

#else

/* Normal: 16 bit address */
#define boot_page_fill(address, data) __boot_page_fill_normal(address,
data)
#define boot_page_erase(address)
__boot_page_erase_normal(address)
#define boot_page_write(address)
__boot_page_write_normal(address)
#define boot_rww_enable()             __boot_rww_enable()
#define boot_lock_bits_set(lock_bits) __boot_lock_bits_set(lock_bits)

#endif

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Das Problem liegt darin, dass "boot.h" für den ATmega128 eigentlich
die "Extended: >16 bit address" (32 Bit) verwenden sollte, statt
dessen aber nur die "Normal: 16 bit address" nutzt.

Dies kommt daher, weil die Abfrage

   #elif ((FLASHEND > USHRT_MAX) && (__USING_MINT8))

fehlschlägt, weil "__USING_MINT8" == FALSE ist. Ich war dann einfach
so frech, und habe diese Abfrage bei mir eigenmächtig ergänzt (Sorry
Andreas). In meiner "boot.h" steht nun also:

   #elif ((FLASHEND > USHRT_MAX) && (__USING_MINT8)) ||
defined(_AVR_ATmega128_)

Damit habe ich zwar die eigentliche Fehlerursache nicht beseitigt, aber
in meinem Fall kann ich jetzt wenigstens den kompletten Adressbereich
flashen.


@Andreas Schwarz:

Vielleicht könntest Du mal nachforschen, warum beim ATmega128
"__USING_MINT8" == FALSE gesetzt ist.

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


Lesenswert?

War ein Bug:

https://savannah.nongnu.org/bugs/?func=detailitem&item_id=15559

Eigentlich ist das conditional für __USING_MINT8 mittlerweile
komplett überflüssig, ich werde das gleich mal rauswerfen.

von Magnus Müller (Gast)


Lesenswert?

>> @Andreas Schwarz:
>>
>> Vielleicht könntest Du mal nachforschen, warum beim ATmega128
>> "__USING_MINT8" == FALSE gesetzt ist.

Sorry, sollte nicht an Andreas Schwarz, sondern natürlich an Dich
(Jörg) adressiert sein ;)

Cool... dann hab ich ja wenigstens die richtige Fehlerquelle gefunden
selbstlob *ggg*

Schönen Abend noch wink
/* Magnetus */

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.