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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.