www.mikrocontroller.net

Forum: Compiler & IDEs Funktion im Bootbereich aufrufen


Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte auf einem ATMega64 aus meinem Programm Daten im Flashspeicher 
ablegen.
Die Software selber soll mittels Bootloader übertragen werden.
Um nun aus dem Hauptprogramm Daten ins Flash zu schreiben muss sich die 
flash-write Funktion ja im Bootloader Bereich befinden. (d.h. hinter der 
mittels BOOTSZ0 und BOOTSZ1 festgelegten Bootloaderadresse liegen)
Daher habe ich die funktion wie folgt definiert:
void __attribute__ ((section (".pmBoot"))) writeFlashPage(uint32_t pagestart, uint16_t *Dataptr) {...}
und die section im Makefile hinter den Bootloader verschoben.

Dies Funktioniert hier auch so inkl. Bootloader, nur AVRProg meckert 
natürlich an das im Bootloader bereich geschrieben werden soll und ich 
kann diesen daher ja auch nicht schützen.

Nun möchte ich diese writeFlashPage funktion im Bootloader integrieren 
und aus den Hauptprogramm darauf zugreifen.

Leider weis ich jetzt nicht wie ich dieses hin bekomme. Mein Versuch mit
void (*writeFlashPage)(uint32_t pagestart, uint16_t *Dataptr) = 0x00fe00; 
funktioniert so leider nicht.

kann mir jemand hier weiterhelfen?

Danke und Gruß

Markus

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus wrote:

> Leider weis ich jetzt nicht wie ich dieses hin bekomme. Mein Versuch mit
void (*writeFlashPage)(uint32_t pagestart, uint16_t *Dataptr) = 0x00fe00; 
> funktioniert so leider nicht.

Was genau bedeutet "funktioniert nicht"?

Du müsstest als Adresse natürlich auch die genaue Adresse der Funktion 
eintragen, und nicht die Startadresse des ganzen Bootloaders.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

0x00fe00 ist die Adresse in der die Section .pmBoot liegt, in der nur 
die Funktion writeFlashPage(..) liegt.

im Makefile so angeben:
EXTMEMOPTS 
=-Wl,--section-start=.pmData=0x002500,--section-start=.pmBoot=0x00fe00

Ich habe jetzt im ersten versuch das Programm mit der integrierter 
Funktion per bootloader übertragen.
-> Funktion ok.
dann in dem Programm die Funktion durch
void (*writeFlashPage)(uint32_t pagestart, uint16_t *Dataptr) = 0x00fe00; 
 ersetzt und erneut peer bootloader übertragen.
Die Funktion im Bootbereich wird dabei ja nicht überschrieben und ist 
auch noch vorhanden (ich habe zur Überprüfung das Flash ausgelesen)

Jetzt bleibt das Programm beim Zugriff auf die Funktion hängen und 
startet irgentwann neu (obwohl der WDT noch nicht aktiviert ist)

Mir ist jedoch aufgefallen das die .text section im zweiten Fall 24 Byte 
grösser ist, ich hätte ja erwartet das sich hier nichts ändert.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du widersprichst dir. Was genau hast du denn nun im Bootloaderbereich, 
nur die Funktion oder einen kompletten Bootloader, der die Funktion 
enthält?

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Bootbereich liegt der bootloader plus diese Funktion die vom 
"normale" Programm aus genutzt werden soll.
Diese Funktion liegt in einer eigenen Section ab 0x00fe00, damit ich 
eine definierte Adresse für die Funktion habe.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, der Bootloader liegt also vor der Funktion.

Wahrscheinlich rechnet der Compiler bei direkten Zuweisungen an einen 
Funktionspointer den Wert nicht um. Du musst ihn also selber durch 2 
teilen.

Alternativ kannst du die Funktion extern deklarieren und dem Linker die 
Adresse über die Kommandozeile mitteilen. Dann wirst du die zusätzlichen 
24 Byte auch wieder los.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja das war es
void (*writeFlashPage)(uint32_t pagestart, uint16_t *Dataptr) = (0x00fe00/2);

funktioniert!

Danke, danke!

und wie kann ich alternativ dem Linker die Adresse mitteilen?

Danke und Gruß

Markus

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> und wie kann ich alternativ dem Linker die Adresse mitteilen?

-Wl,--defsym=writeFlashPage=0xfe00

(Hier aber die Byte-Adresse)

Autor: mar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder noch diese Alternative, funktioniert auch:

Header-File:
typedef void (*writeFlashPage_fn_ptr_t)(uint32_t pagestart, uint16_t *Dataptr);

#define writeFlashPage(pagestart, Dataptr)   ((writeFlashPage_fn_ptr_t)(0x00fe00/2))(pagestart, Dataptr)

Damit ist es nicht erforderlich, einen Pointer anzulegen, da die Adresse 
in die entsprechend typisierte Funktion gecastet wird.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.