Forum: Mikrocontroller und Digitale Elektronik AVR - Ram-Daten im Bootloader und Hauptprogramm


von Frank S. (oldman)


Lesenswert?

Hallo ich möchte aus dem Flashprogramm Daten in einer RamVariablen an 
den Bootloader übergeben.
Geht sowas überhaupt und wenn ja wie.
Ich denke mal, man müsste die Variable auf eine feste Adresse legen und 
sie bei einem Reset vom WDT nicht löschen lassen:

In etwa so, hier fehlt allerdings noch die Adresse:
1
U32 boot_key __attribute__ ((section (".noinit")));



Vielen Dank schon mal

von Silvan K. (silvan) Benutzerseite


Lesenswert?

EEPROM?

von Frank S. (oldman)


Lesenswert?

Sorry, hatte leider vergessen die Randinformationen mitzuteilen:
AT90USB1286
AVR Studio / WINAVR

von Thomas E. (thomase)


Lesenswert?

Silvan König schrieb:
> EEPROM?

Bietet sich eher an. Da hast du selbst die Hoheit über die Adressen und 
nicht der C-Compiler.

mfg.

von Frank S. (oldman)


Lesenswert?

Auf EEPROM-Zugriff wollte ich wenn möglich verzichten.

von Weingut P. (weinbauer)


Lesenswert?

das EEPROM kannst Du öfter überschreiben als den Programmflash und lesen 
geht genau so schnell wie aus dem RAM

von Silvan K. (silvan) Benutzerseite


Lesenswert?

Frank Streichhahn schrieb:
> Auf EEPROM-Zugriff wollte ich wenn möglich verzichten.

Das ist doof. Warum?

von Frank S. (oldman)


Lesenswert?

Der Bootloader kommuniziert über USB.
Das Grundsätzliche Interface zur Kommandoübertragung ist fest definiert 
und kann auch nicht geändert/modifiziert werden(Dies ist eine Vorgabe 
vom Chef). Ich habe für die Implementierung der Kommandos zum Update 
noch maximal 1K übrig. Ich habe mir gerade noch einmal angesehen wie 
teuer ein Zugriff auf ein 32-Bit-Wert ist, 
eeprom_write_dword/eeprom_read_dword jeweils 70Byte die kann ich mir 
nicht leisten.

von SF (Gast)


Lesenswert?

Wenn es nicht allzu viele Bytes sind, es also nicht stört, wenn die 
Bytes auch im Nicht-Bootloader-Mode fehlen, so kann man dies durch 
Manipulation der Stackposition im makefile erreichen.

Der Trick dabei ist, den Stack ein wenig nach unten zu schieben. Dadurch 
bekommst du freien Speicher zwischen der Stackobergrenze und dem 
physikalischen Ramende.

Dazu gibt es das Symbol __stack, das man im Standard makefile vom WinAVR 
manipulieren kann (letztendlich ist dies eine Linkeroption):
1
EXTMEMOPTS += -Wl,--defsym=__stack=<neue stackobergrenze in bytes>

Um zum beispiel bei einem Atmega324 den Stack um zwei Bytes nach unten 
zu verschieben lautet die Option:
1
EXTMEMOPTS += -Wl,--defsym=__stack=0x8008fd

Der so geschaffene Speicher wird von den C-Startuproutinen nicht 
gelöscht und eignet sich somit sehr gut dazu um aus einer Applikation 
Parameter an den Bootloader zu übergeben.

Das Manipulieren von __stack ist im avr-libc-user-manual im Abschnitt 
Memory Areas and Using malloc() beschrieben. Ist also "fast" offiziell 
...

Bei mir funktioniert diese Methode. Habe den Stack bei mir aber auch nur 
um 2 Bytes verschoben...

von Frank S. (oldman)


Lesenswert?

Hallo,
ich habe dies mal ausprobiert. Fruchtet allerdings gar nicht.
Der Stackpointer wird nicht verschoben und resetfest sind die Daten auch 
nicht.
Scheint aber auch bei genauerer Betrachtung im Nachhinein kein Wunder zu 
sein, da EXTMEMOPTS wohl External Memory Options bedeutet.

Wie verschiebe ich den Stackpointer im Internen RAM?

von Thomas E. (thomase)


Lesenswert?

Frank Streichhahn schrieb:
> Wie verschiebe ich den Stackpointer im Internen RAM?

Project >> Configuration Options >> Memory Settings:

Unten in der Mitte.

mfg.

von SF (Gast)


Lesenswert?

Das Beispiel galt natürlich für ein makefile und nicht für AVR-Studio!

Im AVR-Studio muss man dem Linker auf andere Art&Weise die Option 
"-Wl,--defsym=__stack=<neue stackobergrenze in bytes>" mitgeben.

von Frank S. (oldman)


Lesenswert?

@SF
Vielen Dank, ich hatte nach meinem Post noch etwas rumprobiert und es 
zum Laufen gebracht. Dein Typ war Gold wert.

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.