mikrocontroller.net

Forum: Compiler & IDEs PROGMEM in section .bootloader


Autor: Richard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich versuche eine Array als __attribute__((_progmem_)) und
_attribute_ ((section (".bootloader"))) zu zeichnen aber es klappt
nicht. Die Idee ist die Array in PROGMEM zu haben, aber in einer
bestimmter Sektion... Beispiel:

const uint16_t dk[] PROGMEM = {0xc564, 0x7a38}; // OK, aber nicht wo es
sein soll
const uint16_t dk[] BOOTLOADER_SECTION = {0xc564, 0x7a38}; // OK, aber
lpm_read_word geht nicht
const uint16_t dk[] PROGMEM BOOTLOADER_SECTION = {0xc564, 0x7a38}; //
waere ideal, aber geht nicht

Ist sowas in GCC/C ueberhaupt moeglich? (In GCC/asm geht's noch...)

Danke,
Richard

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuch mal

char Test __attribute__((_irgendwo_));

Dann im makefile (bei den Linkerflags)

LDFLAGS += -Wl,--section-start=.irgendwo=0x0100 #Beispieladdresse!!!

Dann müsste die Variable im Flash-Bereich liegen!
(FLASH-Zugriffsfunktionen verwenden!! Direkter Zugriff nicht möglich!)
Ob das allerdings "guter Stil" ist, weiß ich nicht!

Autor: Richard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Tobi,

die Sektion ".bootloader" habe ich schon relokiert, wie Du es
beschreibst. Das Problem ist, es geht nicht wenn ich versuche beide
Attributes zu mischen. Also, wenn ich die Variable NUR als attribute
((irgendwo)) deklariere, dann geht lpm_read_word nicht, und wenn sie
nur als attribute ((progmem)) deklariert ist, dann wird sie nicht
mehr in Sektion ".bootloader" gesteckt (aber lpm_read_word geht).

Im moment habe ich als "workaround", die ganze Sektion ".text"
relokiert, und der Bootloader wurde zu einem selbstaendigen Projekt.
Sogar schlimmer - der Bootloader hat zwei Stufen (erste Stufe laedt
alles im XRAM, zweite Stufe liest XRAM und programmiert Flash). Die
zwei Stufen sind noetig denn der Bootloader muss so viel wie moeglich
"updateable" sein. So, ich brauche im Moment 3 Projekte, zwei fuer
jede Bootloader Stufe, 1 fuer die eigentliche Applikation. Es ist gar
nicht elegant...

Autor: Volkmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Tobi,

was ich nicht verstehe: Wieso möchtest Du den Bootloader im Projekt der
Applikation behandeln? Dies sind doch eigentlich 2 unabhängige
Programme. Ich würde es eher als unelegant sehen, den Bootloader und
die Applikation zusammen in einem Projekt zu haben. Den Bootloader kann
man schließlich auch für andere Applikationen verwenden.

Volkmar

Autor: Volkmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, sollte

Hallo Richard,

und nicht Tobi heißen ;-)

Volkmar

Autor: Richard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Volkmar,

Du hast recht. Der Bootloader soll unabhaengig sein. So werden durch  C
startup-code alle Static/Global Variablen Nulliert und der Stack Pointer
reset, etc... Bei mit ist der Bootloader aber zwei-Teilig, und ich
wollte bestimmen wo genau die PROGMEM Consts allokiert werden. Es ist
vielleicht das einfachste die LPM Routinen umzuschreiben damit sie
nicht mit PROGMEM  sondern MYSECTION  arbeiten...

Danke,
Richard

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.