Forum: Compiler & IDEs PROGMEM in section .bootloader


von Richard (Gast)


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

von Tobi (Gast)


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!

von Richard (Gast)


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...

von Volkmar (Gast)


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

von Volkmar (Gast)


Lesenswert?

Sorry, sollte

Hallo Richard,

und nicht Tobi heißen ;-)

Volkmar

von Richard (Gast)


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

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.