AVR - Ram-Daten im Bootloader und Hauptprogramm

OP #2159754
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
OP #2159832
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.
Gast #2159877
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...
OP #2160082
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren